【发布时间】:2018-09-07 12:59:00
【问题描述】:
我只是想知道是否有人可以向我解释为什么这些不同的数据类型在我的代码中舍入不同? (注意:这不是变量的实际声明方式,而是它们的存储方式。为了清楚起见,我只是这样显示它们)
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
这是否与双精度类型与十进制类型的舍入方式有关?
【问题讨论】:
-
你应该包括
amount和taxPercentage的分配 -
换句话说,当我使用
100和-.00025时,这不会为我复制。但是双精度和小数肯定有不同的精度。此外,除非您转换为小数,否则您的第一个样本(“未舍入”结果)不会编译。 -
$"{ amount * taxPercentage : G20}"打印出什么?还有$"{ (decimal)(amount * taxPercentage) : G20}"?发现有什么不同吗? -
另外,您应该完全避免这个问题。
decimal的语言正好用于需要精确计算的财务计算。不要在涉及金钱时使用double,因为这种不愉快的事情往往会出现。
标签: c# casting type-conversion rounding mscorlib