【发布时间】:2019-07-24 12:49:57
【问题描述】:
在 C# 中,将 double 类型数字转换为整数部分包含 9 个或更少字符的字符串类型会给出正确的值。但是将整数部分改成大于9的字符,得到的结果却不尽如人意。
例如,
123456789.123456789 结果“123456789.1235”(四舍五入到小数点后 4 位)是正确的。
但是,1234567891111.123456789,结果“1234567891111.1200”是错误的。
预期输出为“1234567891111.1235”。
下面是我尝试过两次修复的代码,但没有一个给出所需的输出。
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
double sample = 0.0;
string fieldText = "1234567891111.12345678";
// Fix 1
double.TryParse(fieldText,System.Globalization.NumberStyles.Any, CultureInfo.CurrentCulture, out sample);
Console.WriteLine(sample); // 1234567891111.12
// Fix 2
string FormattedText = string.Format(CultureInfo.InvariantCulture, "{0:0.0000}", 1234567891111.123446789);
Console.WriteLine(FormattedText); // 1234567891111.1200
// Expected output - 1234567891111.1235
}
}
请推荐,
- 如何正确舍入小数,整数部分具有更多字符 (>9),如示例中所述?
- 另外,Double类型转字符串时如何显示完整的数字(1234567891111.123456789)而不是科学计数法(1.23456789111112E+21)?
提前致谢。
【问题讨论】:
-
没有所谓的“正确”舍入。有不同类型的舍入,我建议您阅读该主题,特别是 .NET 使用的类型。
-
除了 Caius Jard 所说的,这是正确的,浮点并没有对所有值都有精确的表示,实际上有无限数量的“非整数”值不能表示为浮点数的精确值。
-
string FormattedText = string.Format(CultureInfo.InvariantCulture, "{0:E12}", 1234567891111.123446789M);可能值得一试。 -
var rounded = Math.Round(1234567891111.123446789, 4); string formattedText = rounded.ToString("R4");或string formattedText = string.Format(CultureInfo.InvariantCulture, "{0:R4}", 1234567891111.123446789);