Math.Floor()和Math.Truncate()之间的区别


422

Math.Floor()Math.Truncate().NET 和有什么不一样?


8
例如Math.Floor(5.4)= 5 Math.Truncate(5.4)= 5
subramani

3
10年后,您真的需要这个吗?大声笑
L_Church '18

1
为什么十年后有赏金?已经有很多答案。我在这里想念什么吗?
水坑

3
这个人只问了一个问题,此后就离开了网站。我想这就是他一直想知道的全部..:D
Nikos '18

Answers:


484

Math.Floor向下Math.Ceiling舍入,向上Math.Truncate舍入并向零舍入。因此,Math.Truncate就像是Math.Floor正数,而像Math.Ceiling为负数。这是参考

为了完整Math.Round起见,四舍五入到最接近的整数。如果数字恰好在两个整数之间,则将其舍入为偶数。参考。

另请参阅:Pax Diablo的答案。强烈推荐!


31
@Chris,我建议您修正对舍入的描述,有两种舍入方法(AwayFromZero和ToEven),并且由于不能进行小数舍入,因此不能舍入到最接近的整数
paxdiablo

1
因此,仅在原始问题上添加一个简短的内容-Math.Truncate和仅将小数或双精度类型转换为int有什么区别?难道不是也趋于零吗?
Noam Gal

8
什么时候(int)myDouble(int)Math.Truncate(myDouble)
mpen 2012年

2
什么是(INT)等于在数学课?
雷阳

386

请通过以下链接获取有关以下内容的MSDN描述:

  • Math.Floor,向下舍入为负无穷大。
  • Math.Ceiling,向上取整为正无穷大。
  • Math.Truncate,向上或向下舍入为零。
  • Math.Round,四舍五入到最接近的整数或指定的小数位数。您可以指定行为是否在两种可能性之间完全等距,例如四舍五入,以使最终数字为偶数(“ Round(2.5,MidpointRounding.ToEven)”变为2)或使其远离零(“ Round(2.5,MidpointRounding.AwayFromZero)”变为3)。

以下图表和表格可能会有所帮助:

-3        -2        -1         0         1         2         3
 +--|------+---------+----|----+--|------+----|----+-------|-+
    a                     b       c           d            e

                       a=-2.7  b=-0.5  c=0.3  d=1.5  e=2.8
                       ======  ======  =====  =====  =====
Floor                    -3      -1      0      1      2
Ceiling                  -2       0      1      2      3
Truncate                 -2       0      0      1      2
Round (ToEven)           -3       0      0      2      3
Round (AwayFromZero)     -3      -1      0      2      3

请注意,Round它的功能要比看起来强大得多,这仅仅是因为它可以舍入到特定数量的小数位。其他所有的数字总是四舍五入到零。例如:

n = 3.145;
a = System.Math.Round (n, 2, MidpointRounding.ToEven);       // 3.14
b = System.Math.Round (n, 2, MidpointRounding.AwayFromZero); // 3.15

对于其他功能,您必须使用乘/除技巧才能达到相同的效果:

c = System.Math.Truncate (n * 100) / 100;                    // 3.14
d = System.Math.Ceiling (n * 100) / 100;                     // 3.15

7
Pax,我认为您有一个错误:Round(AwayFromZero)-3 -2 1 2 3 Math.Round(-1.2,MidpointRounding.AwayFromZero)== -1 Math.Round(0.3,MidpointRounding.AwayFromZero)== 0.0等
dtroy

1
谢谢@dtroy,我从来不需要使用该模式,尽管我在文本中正确记录了该模式,但我完全弄错了示例。希望现在已解决。
paxdiablo,2009年

很抱歉对这样一个老问题发表评论,但我不得不问:如何将“ ToEven”四舍五入到小数点后两位?肯定是奇数,甚至只适用于整数吗?
Richiban 2014年

4
@Richiban,应even视为四舍五入后的最后一位数字的属性,而不是意味着整数必须为2的倍数。顺便说一句,很抱歉花了这么长时间才回覆您,希望您不要只是坐在那里等我的回复:-)
paxdiablo 2015年

62

Math.Floor() 向负无穷大舍入

Math.Truncate 向上或向下舍入为零。

例如:

Math.Floor(-3.4)     = -4
Math.Truncate(-3.4)  = -3

Math.Floor(3.4)     = 3
Math.Truncate(3.4)  = 3

2
简洁明了的解释和简短示例,应将其标记为该问题的答案。
nivs1978 '18

44

一些例子:

Round(1.5) = 2
Round(2.5) = 2
Round(1.5, MidpointRounding.AwayFromZero) = 2
Round(2.5, MidpointRounding.AwayFromZero) = 3
Round(1.55, 1) = 1.6
Round(1.65, 1) = 1.6
Round(1.55, 1, MidpointRounding.AwayFromZero) = 1.6
Round(1.65, 1, MidpointRounding.AwayFromZero) = 1.7

Truncate(2.10) = 2
Truncate(2.00) = 2
Truncate(1.90) = 1
Truncate(1.80) = 1

29

Math.floor向左
Math.ceil滑动...
Math.truncate向右滑动... croioss crooooss(地板/天花板始终朝着0)恰恰
Math.round,真正平滑...(最靠近侧面)

我们去上班吧!(⌐□_□)

向左... Math.floor
现在把它拿回来... --
这次是两跳...-=2

大家都拍拍手✋✋

你能走多低?你能走低吗?一路走向floor

if (this == "wrong")
    return "i don't wanna be right";

Math.truncate(x)也与相同int(x)
通过删除正或负分数,您总是朝着0前进。


哈哈哈不错的混音。
丹尼尔说,请

26

它们在功能上等同于正数。不同之处在于它们处理负数的方式。

例如:

Math.Floor(2.5) = 2
Math.Truncate(2.5) = 2

Math.Floor(-2.5) = -3
Math.Truncate(-2.5) = -2

MSDN链接: - Math.Floor方法 - Math.Truncate方法

PS谨防Math.Round可能不是您期望的那样。

要获得“标准”舍入结果,请使用:

float myFloat = 4.5;
Console.WriteLine( Math.Round(myFloat) ); // writes 4
Console.WriteLine( Math.Round(myFloat, 0, MidpointRounding.AwayFromZero) ) //writes 5
Console.WriteLine( myFloat.ToString("F0") ); // writes 5

24

试试这个,例子:

Math.Floor() Math.Truncate()

Math.Floor(2.56) = 2
Math.Floor(3.22) = 3
Math.Floor(-2.56) = -3
Math.Floor(-3.26) = -4

Math.Truncate(2.56) = 2
Math.Truncate(2.00) = 2
Math.Truncate(1.20) = 1
Math.Truncate(-3.26) = -3
Math.Truncate(-3.96) = -3

也是Math.Round()

   Math.Round(1.6) = 2
   Math.Round(-8.56) = -9
   Math.Round(8.16) = 8
   Math.Round(8.50) = 8
   Math.Round(8.51) = 9

math.floor()

返回小于或等于指定数字的最大整数。MSDN system.math.floor

math.truncate()

计算数字的整数部分。MSDN system.math.truncate



15

Math.Floor():返回小于或等于指定的双精度浮点数的最大整数。

Math.Round():将值四舍五入到最接近的整数或指定的小数位数。


1
OP询问了和之间的区别,Floor()Truncate()不是Floor()和之间的区别Round()
罗伯特·哥伦比亚

5

Math.floor()将始终四舍五入,即,它返回LESSER整数。While round()将返回NEAREST整数

math.floor()

返回小于或等于指定数字的最大整数。

math.truncate()

计算数字的整数部分。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.