C# 浮点数加倍

Posted

技术标签:

【中文标题】C# 浮点数加倍【英文标题】:C# Float to Double 【发布时间】:2011-09-20 08:06:43 【问题描述】:
static void Main(string[] args)

           double y = 23.12F;
           Console.WriteLine(y);
           Console.Read();

为什么 y 的值显示 23.1200008392334 而不是 23.12

static void Main(string[] args)
    
        int i = -9; uint j = (uint)i;
        Console.WriteLine(j);
        Console.Read();
    

j 如何显示值 4294967287

【问题讨论】:

你的第二个例子看起来很奇怪。您正在将负数转换为不支持负数的类型 -9 的two's complement 是:1111 1111 1111 1111 1111 1111 1111 0111。把这个数字带入一个可以将二进制转换为十进制的计算器,你得到 4294967287 ;p 【参考方案1】:

浮点数仅保证对于整数值是精确的;除此之外,它们不能代表所有数字;由于 IEEE754 的工作原理,23.1200008392334 是最接近 23.12 的版本。

如果您想要“典型”处理十进制值...请改用decimal

decimal y = 23.12M;

使用uint - 因为uint 没有负值。相反,您从uint 的最大值向后跟踪。如果您不想要这个,请使用checked

uint j = checked((uint) i);

checked

    uint j = (uint)i;

然后它会在一阵火花中爆炸。有时是好事;有时不好。 unchecked 是默认值。

【讨论】:

【参考方案2】:

根据 MSDN '这就是 double 的工作原理' http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/1fcf6486-807d-4dce-8aef-7fe5268b568d/

我知道这是 Java,但与 C# 非常相似: Convert float to double without losing precision

【讨论】:

以上是关于C# 浮点数加倍的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将字符串转换为浮点数

在 C# 中针对浮点数验证整数值

如何将浮点数从 C# 应用程序发送到 C++ 应用程序?

在 C# 中“转换”浮点数为双精度值

在 Swift 中将半精度浮点数(字节)转换为浮点数

C# 隐式运算符 MyType(int value) 自动“支持”从浮点数转换