为什么Math.Round不返回int?

Rob*_*cks 34 c# math

在C#中,为什么舍入数学函数Floor,Ceiling和Round不返回int?考虑到函数的结果将始终是一个整数,为什么它返回一个float,doubledecimal

Alv*_*ong 32

double范围为±5.0×10 -324至±1.7×10 308,long范围为-9,223,372,036,854,775,808至9,223,372,036,854,775,807.不幸的是,并非所有积分浮点值都可以用整数表示.

例如,1e19已经超出了64位有符号整数的范围.

(long)Math.Round(1e19) == -9223372036854775808L // WTF?
Run Code Online (Sandbox Code Playgroud)

虽然这是事实,该单参数重载Math.Round(double)Math.Round(decimal)总是会返回一个整数值,这些重载仍不能返回一个整数值类型.

如果您知道传递给函数的值将返回一个可由整数值类型表示的值,则可以自己进行转换.图书馆不会这样做,因为它需要考虑一般情况.

  • 但是请注意,有一些长整数*不能*表示为双精度:`(double)100000000000000001L == 1e17`(和`1e17 == 1e17 + 1`). (3认同)

Hab*_*bib 13

考虑到函数的结果总是一个整数,

不,它不会.您甚至可以使用Math.Round方法(Double,Int32)指定位数

digits类型:
System.Int32
返回值中的小数位数.

  • +1确实,因为并非所有时间我们都需要舍入到int (2认同)