Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.Double的精度损失_Java_Double_Precision_Double Precision - Fatal编程技术网

java.lang.Double的精度损失

java.lang.Double的精度损失,java,double,precision,double-precision,Java,Double,Precision,Double Precision,假设我有两个双值。其中一个很大,一个很小 double x = 99....9; // I don't know the possible max and min values, double y = 0,00..1; // so just assume these values are near max and min. 如果我把这些值加在一起,我会失去精度吗 换句话说,如果我给它赋值,最大可能的双精度值会增加吗?如果我选择一个小的整数部分,最小可能的双倍值会减少吗 double z =

假设我有两个双值。其中一个很大,一个很小

double x = 99....9;  // I don't know the possible max and min values,
double y = 0,00..1;  // so just assume these values are near max and min.
如果我把这些值加在一起,我会失去精度吗

换句话说,如果我给它赋值,最大可能的双精度值会增加吗?如果我选择一个小的整数部分,最小可能的双倍值会减少吗

double z = x + y;    // Real result is something like 999999999999999.00000000000001

双精度值并非均匀分布在所有数字上。double使用数字的浮点表示法,这意味着您有固定数量的位用于指数,固定数量的位用于表示实际数字/尾数

因此,在您的示例中,使用大值和小值将导致删除较小的值,因为它不能使用较大的指数来表示


不降低精度的解决方案是使用具有潜在增长精度的数字格式,如BigDecimal,它不限于固定位数。

双精度值并非均匀分布在所有数字上。double使用数字的浮点表示法,这意味着您有固定数量的位用于指数,固定数量的位用于表示实际数字/尾数

因此,在您的示例中,使用大值和小值将导致删除较小的值,因为它不能使用较大的指数来表示


不降低精度的解决方案是使用具有潜在增长精度的数字格式,如BigDecimal,它不限于固定位数。

如果您尝试将太大的值或太小的值指定为双精度,编译器将给出错误:

试试这个

    double d1 =  1e-1000;
    double d2 =  1e+1000;

如果您试图为太大的值或太小的值指定一个double,编译器将给出一个错误:

试试这个

    double d1 =  1e-1000;
    double d2 =  1e+1000;

我使用的是十进制浮点算法,精度为三位十进制数字,与典型的二进制浮点算法基本相同。假设你有123.0和4.56。这些数字由尾数0表示我使用的是精度为三位十进制数字的十进制浮点算法,其特征与典型的二进制浮点算法大致相同。假设你有123.0和4.56。这些数字由尾数0表示。如果您担心精度,请不要使用double,而要使用BigDecimal。@geert3 BigDecimal也不能保证保持精度——只要您需要除法。@MarkoTopolnik确实如此。您只需要自己指定所需的精度。e、 g.新的大小数a.divide新的大小数b,5,取整模式;BigDecimal三=新的BigDecimal三;System.out.printlnONE.dividethree,5,HALF_UP.multiplethree;打印0.99999。大多数人会称之为精度的损失。也许你脑子里有一个别出心裁的定义,它被称为其他的东西。如果你担心精度,就不要用double,用BigDecimal。@geert3 BigDecimal也不能保证精度——只要你需要除法。@MarkoTopolnik肯定会的。您只需要自己指定所需的精度。e、 g.新的大小数a.divide新的大小数b,5,取整模式;BigDecimal三=新的BigDecimal三;System.out.printlnONE.dividethree,5,HALF_UP.multiplethree;打印0.99999。大多数人会称之为精度的损失。也许你脑子里有一个别出心裁的定义,它被称为其他东西。