C# 在强制转换和计算返回错误结果时使用Math.Round()
我只是好奇,是否有人能向我解释为什么这些不同的数据类型在我的代码中循环不同?(注意:这不是变量的实际声明方式,而是它们的存储方式。为了清晰起见,我只是这样显示它们) 首先,不全面的结果:C# 在强制转换和计算返回错误结果时使用Math.Round(),c#,casting,type-conversion,rounding,mscorlib,C#,Casting,Type Conversion,Rounding,Mscorlib,我只是好奇,是否有人能向我解释为什么这些不同的数据类型在我的代码中循环不同?(注意:这不是变量的实际声明方式,而是它们的存储方式。为了清晰起见,我只是这样显示它们) 首先,不全面的结果: itemTax = (decimal)(amount * taxPercentage); // itemTax returns -0.225 如果我先四舍五入,然后转换为十进制: itemTax = (decimal)(Math.Round(amount * taxPercentage, 2, Midpo
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(类似于float)是以2为基数的数字,实际上是十进制值的近似值。与十进制值不同,它不能表示无限精度的数字,因此您的-0.025值可能真的是-0.02499999999您应该包括
金额
和taxPercentage
的赋值。换句话说,当我使用100
和-.00025
时,这对我来说不是重现的。但双精度和小数精度肯定不同。此外,除非转换为十进制,否则您的第一个示例(“未舍入”结果)不会编译。打印出来的是什么?和$“{(十进制)(金额*税收百分比):G20}”
?发现有什么不同吗?另外,你应该完全避免这个问题decimal
的语言正好适用于需要精确计算的财务计算。当涉及金钱时,不要使用double
,因为这些不愉快往往会出现。可能会重复
itemTax = (decimal)(amount * taxPercentage);
itemTax = Math.Round(itemTax,2,MidpointRounding.AwayFromZero);
// itemTax returns -0.23