Java Abs(0.33-0.99)=0.6599999为什么?

Java Abs(0.33-0.99)=0.6599999为什么?,java,floating-point,absolute,Java,Floating Point,Absolute,在java中运行kmeans聚类时,数据点0.33和0.99之间的绝对差值显示为0.65999999,而不是0.66 为什么呢 保存数据的两个变量的类型都是double,我正在使用Math.abs()函数 我只花了0.99就看到了这样的问题。当使用其他值进行减去时,结果很好 感谢您的帮助由于存储在内存中的方式,双倍数字并不准确。更多信息请点击此处: 如果您需要一个精确的结果,您应该研究一下这就是浮点数的行为。它们并不准确 检查此项:- 此外,要添加浮点数,请使用二进制分数,而不是十进制分数。如

java
中运行
kmeans
聚类时,数据点0.33和0.99之间的绝对差值显示为0.65999999,而不是0.66

为什么呢

保存数据的两个变量的类型都是
double
,我正在使用
Math.abs()
函数

我只花了0.99就看到了这样的问题。当使用其他值进行减去时,结果很好


感谢您的帮助

由于存储在内存中的方式,双倍数字并不准确。更多信息请点击此处:


如果您需要一个精确的结果,您应该研究一下这就是浮点数的行为。它们并不准确

检查此项:-

此外,要添加浮点数,请使用二进制分数,而不是十进制分数。如果需要精确的十进制值,应该使用
java.math.BigDecimal

您也可以检查此项以了解更多推理和细节:

浮点舍入错误。0.1不能表示为 由于缺少基本因子,因此在base-2中与在base-10中一样准确 五,

浮点数据类型(浮点和双精度)无法在内存位中准确表示。它们大致在内存中表示

将无穷多个实数压缩为有限位数 需要近似表示。虽然有无限的 许多整数,在大多数程序中,整数计算的结果可以 存储在32位中。相反,给定任何固定的位数, 大多数实数计算会产生 无法使用那么多位精确表示。因此 浮点计算的结果通常必须按顺序四舍五入 以适应它的有限表示。这个舍入误差是最大的 浮点计算的特点


请参阅-本文来自Python文档,但问题与语言无关。在许多情况下,二进制浮点不能准确地存储十进制浮点数。本视频对此进行了很好的解释@雅各布:即使你的算盘(还有你的手指+脚趾)也只有有限数量的可用位-P@JensG是的,但是使用我的手指添加会得到正确的结果,而不是1个手指+1个手指=1.999999999个手指:)永远永远不会,无论永远!如果你不介意的话,你能解释一下为什么用
Math.abs(新的浮点(0.33-0.99))
return
0.66
代替吗?BigDecimal并不比
double
更精确。它只适用于一组不同的数字。你能支持这个说法吗?因为,据我所知,BigDecimal更精确。从文档中可以看出:“当MathContext对象的精度设置为0(例如,MathContext.UNLIMITED)时,算术运算是精确的,不接受MathContext对象的算术方法也是精确的。”注意:我没有说它“更精确”。我说它对于一组不同于
double
的数字是精确的(
double
对于许多数字是精确的,如果你知道你在做什么,你可以进行长序列的精确
double
计算),而且“如果你需要精确的结果,你应该研究BigDecimal”是一个错误的描述。让我这样说:我想要1除以3的精确结果。对于这个基本操作,“查看BigDecimal”是浪费时间的。这行不通,我明白了。“在除法的情况下,精确商可以有一个无限长的十进制展开;例如,1除以3。如果商有一个非终止的十进制展开,并且该操作被指定为返回精确结果,则会引发算术异常。”-但是,您可以指定要查看的小数量(我测试的数字高达4679位),使其比双精度更精确。你的意思是“比双精度更精确”。表示法要么精确,要么不精确。