GVKun编程网logo

assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异(assert和declare区别)

7

如果您对assertEquals和Double,Double和assertEquals感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解assertEquals的各种细节,并对Double,Dou

如果您对assertEqualsDouble,Double和assertEquals感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解assertEquals的各种细节,并对Double,Double和assertEquals进行深入的分析,此外还有关于c# – Assert.AreEquals调用object.Equals而不管IEquatable实现如何、c# – 将double与0进行比较是错误的:doubleVariable == 0?、CrossValidator.fit() - IllegalArgumentException:列预测的类型必须等于 ... [array, array],但类型为 double、double equals vs在python中的实用技巧。

本文目录一览:

assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异(assert和declare区别)

assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异(assert和declare区别)

我进行了一个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并且一切都会正常运行(并且测试不会意外失败:-)。

c# – Assert.AreEquals调用object.Equals而不管IEquatable实现如何

c# – Assert.AreEquals调用object.Equals而不管IEquatable实现如何

今天在编写和运行一些测试时,我发现即使我的类实现了IEquatable< MyClass> interface,Assert.AreEqual(instanceOfMyClass,anotherInstance);导致错误.

事实证明,无论如何,Assert.AreEquals都会调用object.Equals(object obj)而不是正确的MyClass.Equals(MyClass obj)函数.

在假设存在逻辑原因的情况下,它是什么?

解决方法

您可以尝试在相关类上重载==并使用泛型“Assert.AreEqual< T>”使用equals运算符的重载.

我个人更喜欢使用Assert.AreEqual(true,InstanceA.Equals(InstanceB)),因为这肯定会使用你的Equals方法;当然这假设你已经对你的Equals方法进行了单元测试,并且100%确定它有效:)

至于Assert使用object.Equals的原因,我想我们不得不问这个类的设计者:)但我想有一个原因是如果你的Equals方法有问题,你的测试结果就不好了.

c# – 将double与0进行比较是错误的:doubleVariable == 0?

c# – 将double与0进行比较是错误的:doubleVariable == 0?

可以这样做吗?
double doubleVariable=0.0;
if (doubleVariable==0) {
   ...
}

或者这个代码会受到潜在的四舍五入问题的困扰?

解决方法

不过,如果你只是比较0,那么这个比较完全合法,因为比较的右边会自动加倍.另一方面,如果要与== 0.10000001进行比较,则会产生所有四舍五入的错误

你最好还是阅读关于浮点数的讨论,这里是0比较:Is it safe to check floating point values for equality to 0?

此外,这个讨论对于浮标上的奇怪的精度问题非常有帮助:Why the result is different for this problem?

即下方会产生错误:

double d1 = 1.000001; double d2 =0.000001;
Console.WriteLine((d1-d2)==1.0);

CrossValidator.fit() - IllegalArgumentException:列预测的类型必须等于 ... [array<double>, array<double>],但类型为 double

CrossValidator.fit() - IllegalArgumentException:列预测的类型必须等于 ... [array, array],但类型为 double

如何解决CrossValidator.fit() - IllegalArgumentException:列预测的类型必须等于 ... [array<double>, array<double>],但类型为 double?

这些是我用于 Python 3.9 和 Spark 3.1.1 的包:

from pyspark.ml import Pipeline
from pyspark.ml.feature import VectorAssemble,StringIndexer
from pyspark.ml.tuning import CrossValidator,ParamGridBuilder
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import MultilabelClassificationEvaluator

我正在尝试将包含具有默认名称的 2 列的矢量化数据集 df_vec 推送到 CrossValidator 函数中:

  • features - 来自 VectorAssembler 的向量
  • label - 来自 StringIndexer 的字符串索引数字。

这是一个6标签的多项逻辑回归问题。

df_vec.printSchema()

root
 |-- features: vector (nullable = true)
 |-- label: integer (nullable = true)

运行以下步骤来设置 CrossValidator:

mlr = LogisticRegression()
mlr_evaluator = MultilabelClassificationEvaluator()
paramGrid = ParamGridBuilder() \
    .addGrid(mlr.maxIter,[200]) \
    .build()

cross_validator = CrossValidator(
    estimator=mlr,estimatorParamMaps=paramGrid,evaluator=mlr_evaluator
)

尝试使用 df_vec 拟合 CrossValidator 对象会引发异常:

cv_model = cross_validator.fit(df_vec)

pyspark.sql.utils.IllegalArgumentException: requirement Failed:
Column prediction must be of type equal to one of the following types:
[array<double>,array<double>] but was actually of type double.

我能够确认仅使用 mlr() 转换后的数据集的输出有一个类型为 double 的列 prediction

x = mlr.fit(df_vec).transform(df_vec)
x.printSchema()

root
 |-- features: vector (nullable = true)
 |-- label: integer (nullable = true)
 |-- rawPrediction: vector (nullable = true)
 |-- probability: vector (nullable = true)
 |-- prediction: double (nullable = false) <---

因此,出于某种原因,CrossValidator 似乎期望采用另一种格式。如果 CrossValidator() 是细粒度的,我可以尝试使用 predictionVectorAssembler 列转换为向量,但事实并非如此。

有人知道如何解决这个问题吗?

解决方法

您可以使用 MulticlassClassificationEvaluator。您只有一个标签作为整数,因此使用多标签评估器没有意义。

double equals vs在python中

double equals vs在python中

我在Python解释器中运行以下命令:

>>> foo = 10>>> dir(foo) == dir(10)True>>> dir(foo) is dir(10)False>>>

为什么是这样?

答案1

小编典典

is检查2个参数引用相同的对象,并==检查2个参数具有相同的值。
dir()返回一个list包含两个相同的数据foo10,而实际list的事情2实例是不同的。

关于assertEqualsDouble,Double和assertEquals的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于c# – Assert.AreEquals调用object.Equals而不管IEquatable实现如何、c# – 将double与0进行比较是错误的:doubleVariable == 0?、CrossValidator.fit() - IllegalArgumentException:列预测的类型必须等于 ... [array, array],但类型为 double、double equals vs在python中的相关知识,请在本站寻找。

本文标签: