在本文中,我们将为您详细介绍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区别)
- 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区别)
Double.MIN_NORMAL
(在Java
1.6中引入)和之间有什么区别Double.MIN_VALUE
?
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);
您的Double
s会被自动取消装箱,double
并且一切都会正常运行(并且测试不会意外失败:-)。
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并注意到这两种方法。我看到parseDouble自1.2起就出现了。如果它本质上具有与valueOf(s)相同的功能,为什么还要添加此方法?
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
小编典典c
而d
在技术上两个不同的对象和==
运营商只比较引用。
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之间的差异比较的相关信息,请在本站查询。
本文标签: