我正在寫一個程序,它從數據庫中取出原始的double值並將它們轉換爲8字節的十六進制字符串,但我不知道如何防止精度損失。從所有設備收到的數據都以雙精度存儲,包括8字節的標識值。雙打如何避免Java中出現雙精度損失?
實例如7.2340172821234e + 16解析正確的沒有精度,其中指數是10^16損失。
但是,在指數爲10^17的情況下,Java會失去精度。 例如,2.88512954935019e + 17由爪哇解釋爲1.44464854248327008E17
代碼我使用看起來像這樣:
public Foo(double bar) {
this.barString = Long.toHexString((long) bar);
if (barString.length == 15) {
barString = "0" + barString; //to account for leading zeroes lost on data entry
}
}
我使用一個類似的測試用例來測試它:
@Test
public void testFooConstructor() {
OtherClass other = new OtherClass();
OtherClass.Foo test0 = other.new Foo(72340172821234000d); //7.2340172821234e+16
assertEquals("0101010100000150", test0.barString); //This test passes
OtherClass.Foo test1 = other.new Foo(144464854248327000d);//1.44464854248327e+17
assertEquals("02013e0500000758, test1.barString); //This test fails
}
單元測試狀態:
Expected: 02013e0500000758
Actual: 02013e0500000760
當I p RINT指出,Java存儲72340172821234000d和144464854248327000d因爲它分別打印的值:
7.2340172821234E16
1.44464854248327008E17
後者值是關閉的8,這似乎是爲一貫很少有我測試過。
有什麼我可以改正這個錯誤嗎?
編輯:這不是我關心的是過去的那些地方有問題。有些人認爲這是重複的問題是問爲什麼浮點數不夠精確,我正在問如何通過與Roman Puchkovskiy建議的類似的解決方法來避免精度損失。
你不能。 'double'的精確度有限。 –
嘗試使用BigDecimal – DwB
@DwB或者,如果它是一個整數BigInteger。 – Dukeling