Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.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# 第17346轮至第1,74轮_C#_.net_Rounding - Fatal编程技术网

C# 第17346轮至第1,74轮

C# 第17346轮至第1,74轮,c#,.net,rounding,C#,.net,Rounding,我使用Math.Round(1.7346,2,远离零)它应该给我1,74,但实际上它给了我1.73 我知道这是因为: “这是因为表示的结果可能会导致精度损失 十进制值作为浮点数或执行算术运算 对浮点值的操作,在某些情况下是四舍五入(Double, Int32,中点舍入)方法可能无法舍入中点 模式参数指定的值。如中所示 以下示例,其中2.135四舍五入为2.13,而不是2.14。 这是因为该方法在内部将值乘以10* 在这种情况下,乘法运算会遇到 精度损失。” 但我实际应该使用哪种.NET方法来进行

我使用
Math.Round(1.7346,2,远离零)
它应该给我1,74,但实际上它给了我1.73

我知道这是因为:

“这是因为表示的结果可能会导致精度损失 十进制值作为浮点数或执行算术运算 对浮点值的操作,在某些情况下是四舍五入(Double, Int32,中点舍入)方法可能无法舍入中点 模式参数指定的值。如中所示 以下示例,其中2.135四舍五入为2.13,而不是2.14。 这是因为该方法在内部将值乘以10* 在这种情况下,乘法运算会遇到 精度损失。”


但我实际应该使用哪种.NET方法来进行正确的舍入?

1.7346应该舍入到1.73,即使有,因为这只会改变“当一个数字介于其他两个数字之间时”(例如,如果它是1.735)的舍入行为

你想要的行为可以通过

Math.Round(Math.Round(1.7346, 3, AwayFromZero), 2, AwayFromZero)

(但不要把它看成是一个黑客)。

总结:)希望有帮助

如前所述。。1.7345应该四舍五入。。因为1.7351将用Math.round()进行取整。 所以,你必须知道你想要什么

Math.round() //Rounds
Math.floor() //Rounds down
Math.ceil() //Rounds up

你的假设部分是错误的。1.7346四舍五入为1.73,因为
AwayFromZero的语义,即:

  • <0.5→ 0.0
  • 0.5→ 1.0
  • >0.5→ 1.0
  • <-0.5→ -1.0
  • -0.5→ -1.0
  • >-0.5→ 0.0
为避免浮点运算引起的问题,请使用精确的十进制数字系统的
十进制
数据类型


要将“自定义”舍入到最接近的较大值或最接近的较小值,可以分别使用或。它们都适用于
double
decimal
类型。

我认为
Math.Round()
以这种方式工作的原因已经被其他人解决了

获得所需结果的另一种方法是将值加0.005:


Math.Round(1.7346+0.005,2,远离零)

中点舍入
仅在所需数字后面的内容类似于“50000”时生效。在其他情况下,
Round
与它的名字不谋而合——它将小数位数舍入到最接近的数字。谢谢你——这就是我现在尝试的方法,并且有效。就连我也有点困惑,因为17346应该是整数,1735应该是整数,1,74,这是我们至少在欧洲期望的吗?@user1083275 no。当四舍五入到两位小数时,我们(欧洲人)只考虑前三位小数,而忽略其余的小数。在您的情况下,我们只看一下
1.734
,并决定,由于
4
,四舍五入值为
1.73
。在舍入中,您不需要多次迭代。当您四舍五入到
n
十进制数字时,您的决定仅基于
(n+1)
十进制数字的值,至少在英国不是这样;1.7346到2dp是1.73,因为0.004向下舍入,而不是向上舍入-在达到精度级别之前,不会从最低有效位开始舍入Math.Ceil()不具有十进制数字的处理功能。您将从中获得一个“整数值”。不,数学。天花板可以处理双精度和十进制类型。。在Ondrej Tucny的答复中也有说明。。他是正确的:)
decimal
是一种存储数字的方法(使用十进制数字)。这与Math.Ceil()/Math.Floor()等的行为方式无关。看看MSDN:Ondrej中给出的示例,您可以使用
Math.Floor/Math.Ceil
函数创建(!)您自己的自定义舍入算法。不过,这还需要更多的算术运算。
Math.round() //Rounds
Math.floor() //Rounds down
Math.ceil() //Rounds up