2009-10-22 43 views
0
ticketPriceInPence = 7360 
percentageToRefund = 100 

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

这导致:73.59获得不同的结果Math.Round

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

这导致:73.60

任何想法,为什么它会导致不同的2个不同的结果

+0

请说明使用的语言和变量的类型。 – 2009-10-22 11:51:53

回答

4

这是浮点数不能represent decimals exactly

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

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)); 
0

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

我建议在阅读维基百科的文章更详细的信息:Wiki Link

1

简单的回答是,这是由于使用浮点数方程舍入误差。这是因为,一般来说,浮点数不存在精确的二进制表示,所以您只能得到近似值。

我注意到你有:

(percentageToRefund * 0.01) 
第一方程式

,并:

(percentageToRefund * 0.01) * 100 
第二

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

如果你与金钱打交道,你应该使用decimal类型(假设C#)

0

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

相关问题