我有一个jUnit测试断言两个双重对象与以下:
Assert.assertEquals(Double expected, Double result);
这很好,然后我决定将其改为使用原语double,结果发现它已被弃用,除非还提供了delta。
所以我想知道的是,在这个assertEquals中使用双对象或原语类型有什么区别?为什么使用没有增量的对象是可以的,但是使用没有增量的原语是不可取的?Java是否在后台做了一些已经考虑了默认增量值的事情?
谢谢
最好这样写:
assertEquals(23.0, 250.0, 0.0)
0.0-它是delta。阅读为什么你的方法被弃用。
二重数学很少给出完全相同的结果。例如,0.1*0.1!=0.01
。在比较双精度结果时,通常至少需要一些增量。
另一方面,如果你比较盒装的Double
s,它假设你想要完全相等。Java没有考虑默认的增量值,但是Double。equals的行为与
=
稍有不同:特别是它对nan的处理。
这在测试中是有意义的,因为
加倍。NaN!=加倍。NaN
,但是在测试中,如果您期望返回NaN
和NaN
,那就是正确的答案。
JUnit中没有带有签名的断言方法
assertEquals(Double expected, Double result);
然而,对于对象,有一种通用的方法:
assertEquals(Object expected, Object result);
这将调用对象的“equals
方法,正如您所料,不建议将其用于比较Double
对象。
对于双打,正如您所观察到的,绝对有必要使用增量进行比较,以避免浮点舍入的问题(在其他一些答案中已经解释过)。如果您使用带有双
参数的assertEquals
的3参数版本
assertEquals(double expected, double actual, double delta);
您的双s将无声地拆箱到双
,一切都将正常工作(并且您的测试不会意外失败:-)。
问题内容: 我的程序的一部分需要在while循环内使用以下值: 0.1 0.2 0.3 … 0.9 所以我需要在循环中提供它们。 这是代码: 我需要输出准确: 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 但这实际上给了我类似的东西: 0.1 0.2 0.300000000000000000000000004 0.4 0.5 0.6 0.79999999999999999
双倍游戏C++ 说一下你最熟悉的语言的优缺点 创建一张表,插入数据,筛选数据,写出对应的sql语句 mysql数据库索引的数据结构是什么,为什么选这个? 请描述一下tcp三次握手和四次挥手的详细过程 请说明一下tcp什么会产生time_await,为什么产生,有什么危害吗,怎么解决? 如果将大量的小数据包合成在一起接受到的大数据包如何拆分为原来的小数据 给一个01字符串数据解密 冒泡排序或者选择排
问题内容: 显然已弃用。 考虑到JUnit的广泛使用,令人惊讶地缺少JUnit的javadocs。你能告诉我如何使用新的吗? 问题答案: Epsilon是您的“模糊因素”,因为双精度可能并不完全相等。Epsilon让您描述它们之间必须有多近。 如果您期望的是3.14159,但需要花费3.14059至3.14259(即0.001以内),那么您应该编写类似 (顺便说一句,22/7达到3.1428+,将
问题内容: 当尝试将双精度型插入到Oracle表的 DOUBLE PRECISION 列中时,当双精度型超出范围时(在我的情况下:太小),我得到一个异常,但是只有在使用时(如果我使用normal ,它会四舍五入)到0)。 表: Java代码: 在插入/更新语句中使用双打之前,是否必须检查并四舍五入? 我可以以某种方式自动将值取整吗? 感谢您的任何见解/提示。 问题答案: = 如您在评论中指出的。
正如文档https://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/中所述,我试图将设置为自动增量,这几乎可以正常工作,但是当试图插入记录时,函数返回的值是,而不是,因此我尝试了以下更改。
问题内容: 我知道双重价值的内部代表是这样的。但是下面的代码仍然让我感到困惑。 码: 输出: 到底是怎么回事?加法,乘法进行得很好,但减法,除法则不好。谁能解释一下 加法为何与减法不同 ? 问题答案: 简短的答案是,对于浮点运算,您存在表示错误和舍入错误。在“知道”表示错误,所以如果没有舍入误差,你看不到它。但是,如果舍入误差太大,则可以。 解决方案是使用BigDecimal或舍入结果。 如果使用