Math.Round() 在转换和计算时返回错误结果
Math.Round() while casting and calculating returning wrong result
我很好奇是否有人可以向我解释为什么这些不同的数据类型在我的代码中的舍入方式不同? (注意:这不是变量的实际声明方式,而是它们的存储方式。为了清楚起见,我只是这样显示它们)
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
这是否与双精度类型与小数类型的方式有关?
确实如此。双精度数(如浮点数)是以 2 为底的数字,实际上是十进制值的近似值。与十进制值不同,它不能表示无限精度数字,因此您的 -0.025 值可能真的是 -0.024999999999
我很好奇是否有人可以向我解释为什么这些不同的数据类型在我的代码中的舍入方式不同? (注意:这不是变量的实际声明方式,而是它们的存储方式。为了清楚起见,我只是这样显示它们)
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
这是否与双精度类型与小数类型的方式有关?
确实如此。双精度数(如浮点数)是以 2 为底的数字,实际上是十进制值的近似值。与十进制值不同,它不能表示无限精度数字,因此您的 -0.025 值可能真的是 -0.024999999999