关于.net:C#精度计算乘以int和double

C# precision calculations multiplying int and double

本问题已经有最佳答案,请猛点这里访问。

考虑此代码:

1
2
Console.WriteLine((197688 * 0.1) == 19768.800000000003); // True
Console.WriteLine((197688 * 0.1) == 19768.8); // False

计算错误吗?

Java-HTTP://IDENE.COM/D3QSUOC->http://ideone.com/wp5pm9


浮点类型(和计算)本质上是不精确的。它们是二进制的,而不是十进制的,因此计算会产生"意想不到的"十进制值。

将其与此进行比较:

1
2
Console.WriteLine((197688 * 0.1m) == 19768.800000000003m); // False
Console.WriteLine((197688 * 0.1m) == 19768.8m); // True

结果如您所料,因为使用了decimal。顾名思义,由于它的内部表示,它适合于十进制计算。

旁注:经验法则是永远不要使用浮点类型进行货币计算。正是因为精度问题与决定值。


double的精度只有15-16位,编译器会将文字转换为最接近的值,该值可以由double表示,这种情况是19768.8表示。