Точный кошмар в Java и SQL Server - PullRequest
4 голосов
/ 17 ноября 2009

Я боролся с кошмаром точности в Java и SQL Server до того момента, когда я больше не знаю. Лично я понимаю проблему и основную причину ее возникновения, но объясняю, что для клиента на полпути по всему земному шару что-то неосуществимо (по крайней мере, для меня).

Ситуация такая. У меня есть два столбца в SQL Server - Qty INT и Price FLOAT. Значения для них - 1250 и 10,8601 - поэтому, чтобы получить общее значение, его Qty * Price и результат 13575.124999999998 (как на Java, так и на SQL Server). Правильно. Проблема в том, что клиент не хочет видеть это, он видит это число только как 13575.125 и все. В одном месте они видят его с точностью до 2 десятичных знаков, а в другом - с 4 десятичными. При отображении в 4 десятичных разрядах правильное число - 13575.125, но при отображении в 2 десятичных разрядах они считают, что это неправильно - 13575.12 - вместо этого должно быть 13575.13!

Помощь.

Ответы [ 11 ]

0 голосов
/ 17 ноября 2009

Если вы не можете исправить основную базу данных, вы можете исправить Java следующим образом:

import java.text.DecimalFormat;

public class Temp {

    public static void main(String[] args) {
        double d = 13575.124999999;
        DecimalFormat df2 = new DecimalFormat("#.##");
        System.out.println( " 2dp: "+ Double.valueOf(df2.format(d)) );

        DecimalFormat df4 = new DecimalFormat("#.####");
        System.out.println( " 4dp: "+Double.valueOf(df4.format(d)) );
    }
}
...