C#数学给出了错误的结果!我理解这个问题背后的基本原理,但让我头疼的是认为这种情况在整个应用程序中都在发生,我需要找到解决方案。双值=141.1;双倍折扣=25.0;双盘=价值*折扣/100;//disc=35.275值-=disc;//值=105.824999999999999值=Functions.Round(Value,2);//Value2=105.8我用双精度表示非常小的数字。不知何故,在计算141.1-35.275时,结果的二进制表示给出的数字仅为0.0000000000001。不幸的是,由于我对数字进行四舍五入,因此给出了错误的答案。我读过有关使用Decimals而不是Doubles的信息,但我无法用Decimal替换Double的每个实例。有没有更简单的方法来解决这个问题?如果您正在寻找自然十进制值的精确表示,则需要在所有地方替换双精度和小数。您只是使用了错误的数据类型。如果你用short代替short,发现需要处理比support更大的值怎么办?这是一样的交易。但是,您真的应该尝试从一开始就理解一些东西……例如,为什么Value不完全等于141.1。我有两篇文章:你应该使用小数——这就是它的用途。浮点运算的行为?这正是它的作用。它的精度有限。并非所有数字都可以准确表示。事实上,实数值有无穷多个,能够表示的只有有限个数。对于此应用程序,decimal的关键是它使用基数10表示-double使用基数2。您可以使用自己编写的一些函数,而不是使用Round来舍入数字,该函数在舍入时使用小的epsilon以允许错误。这就是你想要的答案。你不想要的答案,但无论如何,我要提供的是,如果你想要精度,并且由于你正在判断你的例子可能赚到的钱,你不应该使用二进制浮点数学.二进制浮点数本质上是不准确的,有些数字无法正确表示。使用以10为基数的浮点数实现的十进制数将是一种更好的方法,并且可以避免您在使用双精度数时犯下代价高昂的错误。在花了整个上午的时间尝试用“小数”替换“双精度”的每个实例并意识到我正在打一场必败仗之后,我再次查看了我的Round函数。这可能对那些无法实施正确解决方案的人有用:}首先将值转换为小数,然后调用Math.Round,这将返回“正确”的值。以上就是C#学习教程:C#数学给出错误的结果!如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
