double price = 4.35;
double quantity = 100;
double total = price * quantity; // Should be 100 * 4.35 = 435.00
System.out.println(total); // Prints 434.99999999999999
为什么会这样?
因为 double 的精度类似于:
双精度浮点格式是一种计算机数字格式,占用计算机内存中的 8 个字节(64 位),并使用浮点表示一个很宽的动态范围的值。具有 32 位存储位置的计算机使用两个内存位置来存储一个 64 位双精度数(一个存储位置可以保存一个单精度数)。双精度浮点格式通常指的是 IEEE 754 标准规定的 binary64,而不是 64 位十进制格式 decimal64。
因此,您的值 4.35 并不完全存储为 4.35,而是精确存储
资料来源:维基
看看这里
乘法工作正常,但 4.35 不能完全表示为双精度数。
检查浮点内部表示。
维基说:-
浮点数不能精确地表示所有实数,浮点运算也不能精确地表示真正的算术运算,这一事实导致了许多令人惊讶的情况。这与计算机通常表示数字的有限精度有关。