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