2008-11-06 134 views
2

我正在使用java並引用「double」數據類型。爲了保持簡短,我從標準輸入中讀取了一些值,我在代碼中讀取了雙精度值(我寧願使用類似BigInteger的東西,但現在不可能)。浮點舍入檢測

我希望得到來自用戶的雙重價值,但有時他們可能會喜歡的東西輸入: 999999999999999999999999999.9999999999 我認爲這是超越雙準確地表述,並得到的四捨五入到1.0E27(可能)。

我想獲得一些關於如何檢測某個特定值是否無法在double中精確表示並需要四捨五入的指示(以便我可以拒絕該值或其他此類操作)。

非常感謝您

回答

4

人類輸入的大多數值不會與雙精確表示。

例如,你想防止用戶輸入0.1嗎?這不完全代表雙倍。

要找到錯誤的規模,你可以這樣做:

BigDecimal userAsDecimal = new BigDecimal(userInput); 
double userAsDouble = double.parseDouble(userInput); 
BigDecimal doubleToDecimal = new BigDecimal(userAsDouble); 
BigDecimal error = userAsDecimal.subtract(userAsDouble).abs(); 

然後檢查「錯誤」是否是夠小。

+0

確實你是對的。 更具體地說,我總是會得到正數,最多10位數的精度,所以我的要求是限制整個部分的數字,這樣它就不會導致舍入 – cupu 2008-11-06 13:25:40

+0

恐怕我還是不願意「很明白。你的意思是你實際上只能得到整數嗎?如果是這樣,請使用很長時間。如果沒有,我又輸了... – 2008-11-06 13:34:04

+0

我已經有一個問題,提出請求 謝謝(特別是)和其他人誰回答,雙是真的很糟糕在我的情況下使用......哪我一直在抱怨一段時間:)。 – cupu 2008-11-06 13:48:05

2
double orig = GetSomeDouble(); 
double test1 = orig - 1; 
if (orig == test1) 
    SomethingIsWrong(); 
double test2 = test1 + 1; 
if (orig != test2) 
    SomethingIsWrong(); 
1

不能使用雙重精確存儲東西你問的方式,很少用戶可以輸入一個數字,一個雙能完美表現,但這隻會是巧合。如果你需要存儲確切的數字,你可以使用一個字符串,只要你不需要做任何操作。如果你需要的不僅僅是這些,那麼可能會有這樣的精確數學庫。