为什么C#以这种方式舍入?

Nak*_*aan 2 c# floating-point rounding

所以,我有这个浮点数:

(float)-123456.668915

这是一个随机选择的数字,因为我正在为我写的一大块BCD代码做一些单元测试.每当我将上面的数字与一个字符串("-123456.668915"要清楚)进行比较时,我就会遇到C#如何舍入数字的问题.它将其舍入为-123456.7.这已在NUnit中检查并具有直接控制台输出.

为什么这样四舍五入?根据MSDN,浮点范围约为-3.4*10 ^ 38到+3.4*10 ^ 38,精度为7位.以上数字,除非我完全失去了一些东西,是该范围内,并且只有小数点后6位数字.

谢谢您的帮助!

Jon*_*eet 14

根据MSDN,浮点范围约为-3.4*10 ^ 38到+3.4*10 ^ 38,精度为7位.除非我完全遗漏了某些内容,否则上述数字在该范围内,并且在小数点后仅有6位数.

"小数点后6位"与"6位精度"不同.精度的位数是可以可靠保持的有效位数.您的号码有12位有效数字,因此无法完全表示它并不令人惊讶float.

请注意,该数字(假设为)舍入为-123456.7,确实有7位有效数字.事实上,这不是你的价值float.我强烈怀疑确切的值是-123456.671875,因为它最接近float-123456.668915.但是,当您将精确值转换为字符串表示形式时,结果只有7位数,部分原因是除此之外,数字无论如何都不是真正有意义的.

您可能应该阅读我在.NET中关于二进制浮点的文章以获取更多详细信息.

  • 很少(读:从不)你会收到Jon Skeet的答案,而不是学到新的东西:) (2认同)
  • +1 ... @SimonWhitehead - 不,有时候不会学习新的东西,你会记得"我已经读过Jon去年关于这个问题的文章了"并忘了:) (2认同)