ticketPriceInPence = 7360
percentageToRefund = 100

(int)(Math.Round((ticketPriceInPence * 0.01) * (percentageToRefund * 0.01), 2, MidpointRounding.AwayFromZero) * 100)

结果为:73.59

(int)(Math.Round((ticketPriceInPence * 0.01) * (percentageToRefund * 0.01) * 100, 2, MidpointRounding.AwayFromZero))

结果为:73.60

知道为什么会产生不同的2种不同结果

有帮助吗?

解决方案

不能使用浮点数的旧案例 完全代表小数

你似乎在这里处理钱,然后你真的应该考虑使用十进制

decimal ticketPriceInPence = 7360;
decimal percentageToRefund = 100;
var result1 = (int)(Math.Round((ticketPriceInPence * 0.01m) * (percentageToRefund * 0.01m), 2, MidpointRounding.AwayFromZero) * 100);
var result2 = (int)(Math.Round((ticketPriceInPence * 0.01m) * (percentageToRefund * 0.01m) * 100, 2, MidpointRounding.AwayFromZero));

其他提示

简单的答案是,这是由于使用浮点数的方程中的舍入误差。这是因为,一般来说,没有浮点数的精确二进制表示,所以你得到的只是近似值。

我注意到你有:

(percentageToRefund * 0.01)

在第一个等式中,并且:

(percentageToRefund * 0.01) * 100

在第二个。

后一个表达式将导致舍入误差,因为您首先除以100然后再乘以100。输入不等于输出,差异取决于机器架构,操作系统,语言和编译器。

如果你正在处理钱,你应该使用 decimal 类型(假设C#)

因为浮点数不是确切的数字。我建议您阅读 http://en.wikipedia.org/wiki/Floating_point 。你会看到结果不同的原因。

长话短说。这是因为将浮点值表示为二进制数据时的精度错误。这基本上意味着你无法用32/64位表示每个可能的浮点数,所以2.1实际上是2.1000000000000001等。这就是为什么你不应该做类似2.145 ==“其他值应该是2.145”的事情的原因之一。 / p>

我建议您阅读维基百科上的文章以获取更多详细信息: Wiki Link

这是由于浮点数的精度有限。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top