Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在强制转换和计算返回错误结果时使用Math.Round()_C#_Casting_Type Conversion_Rounding_Mscorlib - Fatal编程技术网

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