Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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:检查两个双精度值是否匹配特定的小数位数_Java_Double - Fatal编程技术网

Java:检查两个双精度值是否匹配特定的小数位数

Java:检查两个双精度值是否匹配特定的小数位数,java,double,Java,Double,比较这两个值应得出“真”: 如果要将a=1.00001和b=0.99999标识为相等: return Math.abs(a - b) < 1e-4; 否则,请使用truncate方法,如所示: 天真地: if(Math.abs(a-b) < 0.0001) if(数学abs(a-b)

比较这两个值应得出“真”:


如果要将
a=1.00001
b=0.99999
标识为相等:

return Math.abs(a - b) < 1e-4;
否则,请使用
truncate
方法,如所示:

天真地:

if(Math.abs(a-b) < 0.0001)
if(数学abs(a-b)<0.0001)
但是,这并不是对所有值都正确。实际上,只要使用
double
,就不可能让它工作,因为
double
是作为二进制分形实现的,甚至没有小数位数

您必须将值转换为
String
BigDecimal
,以对其小数位数进行有意义的测试


您可能需要阅读本书以提高对浮点值工作原理的理解。

谢谢。我是这样做的:

double lon = 23.567889;
BigDecimal bdLon = new BigDecimal(lon);
bdLon = bdLon.setScale(4, BigDecimal.ROUND_HALF_UP);

System.out.println(bdLon.doubleValue());
Apache commons有以下功能: org.apache.commons.math3.util.Precision equals(双x,双y,双eps)

epsilon是你允许的距离。看起来你的应该是1e-5


此方法的源代码似乎使用了其他答案中建议的Math.abs

如果您仍然需要,下面是一个简单的示例:)


比较两个两位数(最多三位小数)并返回true或false的解决方案可能是:

public静态布尔值等于三位小数(双myFirstNumber,双mySecondNumber){
if(Math.abs(myFirstNumber-mySecondNumber)<0.0009){
返回true;
}否则{
返回false;
}
}

喜欢这些简单而精彩的解决方案-1. @迈克尔是对的。这个解决方案是有缺陷的。我想请你解释一下为什么“System.out.println(12512310271255125d==12512310271255124d);”如果double可以精确表示整数值,则打印
true
。这显然是一个错误的说法,因为双倍震级可以工作。还有一个事实是,您不应该在诸如
BigDecimal
之类的引用类型上使用
==
,但这是一个简单的解决方法。对于大多数情况,它们都是很好的解决方案。+1对于
BigDecimal
,这确实做到了所要求的,使得它非常易于维护。在性能显示需要改进之前,这应该是首选解决方案。(-3.17156,-3.1715)返回错误53.917399999是否应与53.9173进行比较?或者到53.9174?你不必做出新的答案,只要接受正确的答案。这真的不取决于你如何翻译这句话吗…?如果您想检查这些值是否等于某个数字,您使用的
字符串
解决方案是正确的,但大多数情况下,在发生这种比较时,您只想知道结果“足够接近”,在这些情况下,行是非常正确的。这只是返回
false
。您应该将整个方法体替换为
return Math.abs(myFirstNumber-mySecondNumber)<0.0009
BigDecimal aa = new BigDecimal(a);
BigDecimal bb = new BigDecimal(b);
aa = aa.setScale(4, BigDecimal.ROUND_DOWN);
bb = bb.setScale(4, BigDecimal.ROUND_DOWN);
return aa.equals(bb);
if(Math.abs(a-b) < 0.0001)
double lon = 23.567889;
BigDecimal bdLon = new BigDecimal(lon);
bdLon = bdLon.setScale(4, BigDecimal.ROUND_HALF_UP);

System.out.println(bdLon.doubleValue());
public static boolean areEqualByThreeDecimalPlaces(double a, double b) {

    a = a * 1000;

    b = b * 1000;

    int a1 = (int) a;

    int b1 = (int) b;

    if (a1 == b1) {
        System.out.println("it works");
        return true;
    }

    else
        System.out.println("it doesn't work");
    return false;