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。大多数人会称之为精度的损失。也许你脑子里有一个别出心裁的定义,它被称为其他东西。