簡體   English   中英

在F#中將float轉換為int

[英]Converting float to int in 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))

對於應該如此簡單的事情來說,這太丑了。

2.4 - 2.0的雙重表示是0.399999999999。 將數字轉換為int時,小數部分將被截斷,因此3.999999999將截斷為3。

實際上,在.Net中有一個decimal數據類型可以幫助您解決這個問題,如果您的數字可以精確地表示為小數部分。

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

然后還請解釋如何獲得4.即我真的必須這樣做

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

對於應該如此簡單的事情來說,它真是太難看了。

當然不是,只需定義

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

要將float轉換為int使用:

let i = Convert.ToInt32(f)

浮點數不是無限精度。 一些數字可以完美地表示(任何涉及2的冪,例如1,1 / 2 = 0.5,1 / 4 = 0.25等),而其他數字則不能(例如1/3不能精確地分解為有限序列)權力的兩個)。 通常,切斷無限級數的末尾會導致數字的編碼版本略小於其真實值。

將此與(int)運算符截斷而不是舍入的事實相結合,您可以遇到應該產生4.0的操作導致3.999999999991的情況,而變為3。

每當您嘗試將浮點/雙精度轉換為整數時,您需要仔細考慮要使用的運算符 - 截斷(向下舍入),向上舍入或舍入到最近。

由於這是浮點表示的問題,因此不僅在F#中,而且在C#和(IIRC)Java和其他語言中也是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM