Java:双打不正常显示

Edd*_*Edd 1 java multiplication

我正在尝试计算以下两个双打的乘积:

double x = 196.0d;
double y = 0.5144d;

double z = x * y;
Run Code Online (Sandbox Code Playgroud)

答案应该是,z = 100.8224;但java计算它z = 100.82239999999999;

是什么造成的?

Daw*_*ica 5

最接近0.5144的双精度浮点数为4633303296638766/2 ^ 53,实际为0.51439999999999996838084825867554.但是,Java将其显示为0.5144,因为如果存在一个足够接近给定双精度浮点数的数字,它具有用于选择具有较少小数位数的数字的启发式方法.

当您将相同的数字乘以196时,错误将复合,您将以100.82239999999999380264625870041结束.这不足以使100.8224显示为100.8224,因为还有另一个双精度浮点数更接近100.8224.