在F#中将float转换为int

时间:2009-01-04 16:31:59

标签: f#

有人可以解释为什么int (0.4 * 10.0)4int ((2.4 - 2.0) * 10.0)3

然后还请解释如何获得4。即我真的必须做int (System.Math.Round((2.4 - 2.0) * 10.0))吗?

对于应该如此简单的事情来说,这太丑了。

5 个答案:

答案 0 :(得分:11)

2.4 - 2.0的双重表示是0.399999999999。将数字转换为int时,小数部分将被截断,因此3.999999999将被截断为3。

答案 1 :(得分:5)

  

然后还请解释如何获得4.即我真的要做

     

int(System.Math.Round((2.4 - 2.0)* 10.0))

     

对于那些应该如此简单的东西来说,这太丑了。

当然不是,只需定义

let round x = int System.Math.Round(x)

答案 2 :(得分:5)

实际上,在.Net中有一个decimal数据类型可以帮助您解决这个问题,如果您的数字可以精确地表示为小数部分。

2.4m - 2.0m == 0.4m
2.4 - 2.0   != 0.4

答案 3 :(得分:3)

float号码转换为int使用:

let i = Convert.ToInt32(f)

答案 4 :(得分:1)

浮点数不是无限精度。一些数字可以完美地表示(任何涉及2的幂,例如1,1 / 2 = 0.5,1 / 4 = 0.25等),而其他数字则不能(例如1/3不能精确地分解为有限序列)权力的两个)。通常,砍掉无限级数的末尾会导致数字的编码版本略小于其真实值。

将此与(int)运算符截断而不是舍入的事实相结合,并且您可以遇到 应该产生4.0的操作导致3.999999999991变为3的情况。

每次尝试将浮点数/双精度数转换为整数时,您都要仔细考虑要使用哪个运算符 - 截断(向下舍入),向上舍入或舍入到最接近。

由于这是浮点表示的问题,不仅在F#中,而且在C#和(IIRC)Java和其他语言中也是如此。