【问题标题】:How to convert integer 999999999 to float 999999999.0 instead of 1000000000.0 in C#? [duplicate]如何在 C# 中将整数 999999999 转换为浮点 999999999.0 而不是 1000000000.0? [复制]
【发布时间】:2019-05-17 10:13:43
【问题描述】:

在 C# 中,要将 int 转换为 float,我们只需要执行 float floatNumber = intNumberConvert.ToSingle(intNumber) 之类的操作。但是,当涉及到999999999这样的大数字时,系统无法正确转换该数字,而是将其转换为不需要的数字1E+09。现在的问题是,是否可以将那个大整数转换为想要的浮点数?

【问题讨论】:

  • 查看“每个计算机科学家都应该了解的浮点运算知识”。这是每个人都应该阅读的内容,或者至少阅读足以了解为什么会发生这种情况以及为什么测试浮点相等性是一个真的坏主意。
  • 为什么浮动而不是双倍?

标签: c# floating-point type-conversion int data-conversion


【解决方案1】:

你可以使用decimal类型吗?

Console.WriteLine(999999999.0f.ToString("N"));
Console.WriteLine(999999999.0m.ToString("N"));;

打印

1,000,000,000.00
999,999,999.00

reference 甚至有一个非常大的例子

在本例中,输出使用货币格式字符串进行格式化。请注意,x 已四舍五入,因为小数位数超过 0.99 美元。变量y 表示最大精确位数,以正确的格式显示。

public class TestDecimalFormat
{
    static void Main()
    {
        decimal x = 0.999m;
        decimal y = 9999999999999999999999999999m;
        Console.WriteLine("My amount = {0:C}", x);
        Console.WriteLine("Your amount = {0:C}", y);
    }
}
/* Output:
    My amount = $1.00
    Your amount = $9,999,999,999,999,999,999,999,999,999.00
*/

【讨论】:

    【解决方案2】:

    一个 32 位浮点数不能准确地表示一个这么大的整数:它只有 24 位可以用来做它(格式中隐含一个)。在 24 位中,您可以表示 16777215。16777216 也适合,因为它是 2 的幂。 999999999 不能完全表示为最多 24 位乘以 2 的幂的数字。

    在 SO 上查看此答案:https://stackoverflow.com/a/3793950/751579

    有关更多信息,请查看 IEEE 浮点 32 位和 64 位格式的详细信息。

    【讨论】:

    • 这是一个很好的解释,但实际的解决方案是使用“十进制”。
    • @tymtam - 也许吧。取决于 OP 的用例,他没有描述。 (例如,也许 double 是合适的。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-17
    • 2016-08-05
    • 2014-02-27
    • 2015-06-01
    • 2021-10-09
    • 2013-08-23
    • 2011-05-21
    相关资源
    最近更新 更多