C#庄家舍入误差doublea=18.565returnMath.Round(a,2)..returns18.57。对于其他所有数字,我都按预期尝试了银行家的舍入方法,例如Math.Round(2.565,2)返回2.56。任何线索为什么以及何时发生?这是一个错误还是我遗漏了有关银行家四舍五入的信息?谢谢..正如马修所说,18.565不能准确表达。实际用到的值为18.565000000000001278976924368180334568023681640625(使用DoubleConverter查到),明显超过了一半。现在我有一种偷偷摸摸的感觉,有时Math.Round认为一个值实际上超出了中点,但它可以准确地表示为接近中点,就在那个点。但是,我没有看到任何描述应用这种情况的文档,显然在这种情况下没有发生。我不想依赖它。当然,即使是四舍五入的值也不是18.57。它实际上是18.570000000000000028421709430404007434844970703125。从根本上说,如果您真的非常关心准确表示分数值,您应该使用小数。它不仅在Math.Round中——它涉及使用浮点值的各个方面。这确实为Math.Round提供了正确的值,当然:十进制m=18.565m;Console.WriteLine(Math.Round(m,2));//打印18.5618.565不能精确表示为双精度数。所以二进制表示略高,所以四舍五入。如果使用小数:小数a=18.565m;returnMath.Round(a,2)它可以准确表示,你不会有这个问题。我的猜测是FP表示意味着它实际上不是尾随5;FP的危险!不过,这工作正常:decimala=18.565M;//double是一个浮点数,所以如果写成18.565,在内存中其实就是18.5650000000000000000000000000000000001,所以超过了中点。以上就是C#学习教程:C#庄家舍入误差分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注---本文收集自网络,不代表立场,如涉及侵权,请指正点击右侧联系管理员删除。如需转载请注明出处:
