[英]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.