Math.Round()在投射和计算时返回错误结果

时间:2018-03-28 18:04:42

标签: c# casting type-conversion rounding mscorlib

我很好奇是否有人能向我解释为什么这些不同的数据类型在我的代码中有所不同? (注意:这不是变量实际声明的方式,它是如何存储的。为了清晰起见,我只是将它们显示出来)

double amount = 15 ;
double taxPercentage = 0.015;
decimal itemTax;

首先,结果是非圆的:

itemTax = (decimal)(amount * taxPercentage);
  // itemTax returns -0.225

如果我先舍入,则转换为十进制:

itemTax = (decimal)(Math.Round(amount * taxPercentage, 2, MidpointRounding.AwayFromZero));
  // itemTax returns -0.22 

如果我先转换为小数,则转:

itemTax = (decimal)(amount * taxPercentage);
itemTax = Math.Round(itemTax,2,MidpointRounding.AwayFromZero);
 //  itemTax returns -0.23

这是否与double类型与十进制类型的方式有关?

1 个答案:

答案 0 :(得分:1)

事实上。 Double(如float)是base-2数字,实际上是十进制值的近似值。与十进制值不同,它不能表示无限精度数,因此-0.025值可能实际上是-0.024999999999