GVKun编程网logo

Java的Double.MIN_NORMAL和Double.MIN_VALUE之间的区别?(java double decimal区别)

8

在本文中,我们将为您详细介绍Java的Double.MIN_NORMAL和Double.MIN_VALUE之间的区别?的相关知识,并且为您解答关于javadoubledecimal区别的疑问,此外,我

在本文中,我们将为您详细介绍Java的Double.MIN_NORMAL和Double.MIN_VALUE之间的区别?的相关知识,并且为您解答关于java double decimal区别的疑问,此外,我们还会提供一些关于assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异、DecimalFormat和Double.valueOf()、Double.valueOf(s)与Double.parseDouble、Double与Double之间的差异比较的有用信息。

本文目录一览:

Java的Double.MIN_NORMAL和Double.MIN_VALUE之间的区别?(java double decimal区别)

Java的Double.MIN_NORMAL和Double.MIN_VALUE之间的区别?(java double decimal区别)

Double.MIN_NORMAL(在Java
1.6中引入)和之间有什么区别Double.MIN_VALUE

assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异

assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异

我进行了一个junit测试,使用以下命令声明了两个Double对象:

Assert.assertEquals(Double expected, Double result);

很好,然后我决定将其更改为使用原始double,除非您也提供了增量,否则该结果被弃用了。

所以我想知道在assertEquals中使用Double对象还是原始类型有什么区别?为什么不使用不带增量的对象,但不推荐使用不带增量的基元呢?Java是否在后台执行了已经考虑了默认增量值的操作?

谢谢。

答案1

小编典典

没有断言方法的JUnit与签名

assertEquals(Double expected, Double result);

但是,有一个通用的对象:

assertEquals(Object expected, Object result);

这将调用对象的equals方法,并且您可以预期,不建议使用此方法来比较Double对象。

如您所见,对于双精度数,绝对有必要使用增量进行比较,以避免浮点舍入的问题(在其他一些答案中已有说明)。如果您使用assertEquals带有double参数的3参数版本

assertEquals(double expected, double actual, double delta);

您的Doubles会被自动取消装箱,double并且一切都会正常运行(并且测试不会意外失败:-)。

DecimalFormat和Double.valueOf()

DecimalFormat和Double.valueOf()

我试图摆脱我的double值的十进制分隔符之后不必要的符号。我这样做是这样的:

DecimalFormat format = new DecimalFormat("#.#####");value = Double.valueOf(format.format(41251.50000000012343));

但是,当我运行此代码时,它会抛出:

java.lang.NumberFormatException: For input string: "41251,5"    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)    at java.lang.Double.valueOf(Double.java:447)    at ...

如我所见,在string这样的Double.valueOf()字符串上效果很好"11.1",但是在like这样的字符串上却令人窒息"11,1"。我该如何解决?有没有比这更优雅的方式

Double.valueOf(format.format(41251.50000000012343).replaceAll(",", "."));

有没有办法覆盖类的默认十进制分隔符值DecimalFormat?还有其他想法吗?

答案1

小编典典

通过

在我的double值的十进制分隔符之后摆脱不必要的符号

您是说要舍入到小数点后5位吗?然后使用

value = Math.round(value*1e5)/1e5;

(当然,Math.floor(value*1e5)/1e5如果您确实希望截断其他数字,也可以)

Double.valueOf(s)与Double.parseDouble

Double.valueOf(s)与Double.parseDouble

将对象强制转换为double并注意到这两种方法。我看到parseDouble自1.2起就出现了。如果它本质上具有与valueOf(s)相同的功能,为什么还要添加此方法?

Double与Double之间的差异比较

Double与Double之间的差异比较

我知道这Double是一个包装类,它包装double数字。今天,我看到了另一个主要区别:

double a = 1.0;double b = 1.0;Double c = 1.0;Double d = 1.0;System.out.println(a == b);  // trueSystem.out.println(c == d);  // false

我真奇怪!

因此,如果Double每次使用,我们都必须执行以下操作:

private static final double delta = 0.0001;System.out.println(Math.abs(c-d) < delta);

我无法解释为什么Double直接将比较做错了。请为我解释。

答案1

小编典典

cd在技术上两个不同的对象和==运营商只比较引用。

c.equals(d)

更好,因为它比较值而不是引用。但是仍然不理想。直接比较浮点值应始终将一些误差(ε)考虑在内(Math.abs(c - d) < epsilon)。

注意:

Integer c = 1;Integer d = 1;

这里的比较会产生true,但是比较复杂(Integer内部缓存,在JavaDoc中有Integer.valueOf()描述):

此方法将始终缓存-128至127(包括)范围内的值,并且可能缓存该范围之外的其他值。

为什么valueOf()呢 由于此方法隐式用于实现自动装箱:

Integer c = Integer.valueOf(1);Integer d = Integer.valueOf(1);

我们今天的关于Java的Double.MIN_NORMAL和Double.MIN_VALUE之间的区别?java double decimal区别的分享已经告一段落,感谢您的关注,如果您想了解更多关于assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异、DecimalFormat和Double.valueOf()、Double.valueOf(s)与Double.parseDouble、Double与Double之间的差异比较的相关信息,请在本站查询。

本文标签: