簡體   English   中英

PostgreSQL和Java之間的浮點數表示形式差異

[英]Floating-point number representation difference between PostgreSQL and Java

我使用PostgreSQL 9.4.1(32位,Windows),並且有一個帶有real列的表-數量。 當我在pgAdmin上執行以下查詢時:

SELECT quantity || ' pcs' FROM table

我得到以下結果:

123.234 psc 123 psc 12 psc 12.3 psc

令人驚訝的是,通過Java驅動程序postgresql-9.4-1201.jdbc4 (和postgresql-9.2-1002.jdbc3 )進行的同一查詢是不同的:

123.2341 psc 123 psc 12 psc 12.3000002 psc

由於quantity不是直接由查詢返回的(而是包含該quantity的字符串),因此我不希望結果出現這種差異。 任何人都可以提出一種解決方案,以使Java結果與pgAdmin的結果相同。

看起來pgAdmin設置為僅顯示3個尾隨數字。

您可以在代碼中使用DecimalFormat對象,以相同的方式顯示數據。

double numberOne = 123.2341;
double numberTwo = 123;
double numberThree = 12;
double numberFour = 12.30000002;

DecimalFormat formatter = new DecimalFormat();
formatter.setMaximumFractionDigits(3);

System.out.println(formatter.format(numberOne));   // 123.234
System.out.println(formatter.format(numberTwo));   // 123
System.out.println(formatter.format(numberThree)); // 12
System.out.println(formatter.format(numberFour));  // 12.3

PostgreSQL表示實數據類型是不精確的,可變精度的數字類型 ,並且在大多數平台上,實類型的范圍至少為1E-37到1E + 37,精度至少為10位小數數字 ,因為它們使用的IEE754單精度表示形式的尾數只有24位。

這意味着在數據庫中 ,123.234和123.2341用相同的值表示。 我假設您在Java中使用double數據類型,其精度約為15個十進制數字。 差異是正常的。

如果您希望這些值相同,則可以嘗試在Java中使用簡單的精度floats ,但是您仍將依賴於Java和pgAdmin之間的顯示模式。

保持十進制值准確性的唯一簡單方法是在PostgreSQL中使用NUMERIC(precision, scale)小數位數NUMERIC(precision, scale) ,在Java中使用BigDecimal

暫無
暫無

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

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