如果您对assertEquals和Double,Double和assertEquals感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解assertEquals的各种细节,并对Double,Dou
如果您对assertEquals和Double,Double和assertEquals感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解assertEquals的各种细节,并对Double,Double和assertEquals进行深入的分析,此外还有关于c# – Assert.AreEquals调用object.Equals而不管IEquatable实现如何、c# – 将double与0进行比较是错误的:doubleVariable == 0?、CrossValidator.fit() - IllegalArgumentException:列预测的类型必须等于 ... [array
- assertEquals(Double,Double)和assertEquals(double,double,delta)之间的Junit差异(assert和declare区别)
- 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区别)
我进行了一个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
并且一切都会正常运行(并且测试不会意外失败:-)。
c# – Assert.AreEquals调用object.Equals而不管IEquatable实现如何
事实证明,无论如何,Assert.AreEquals都会调用object.Equals(object obj)而不是正确的MyClass.Equals(MyClass obj)函数.
在假设存在逻辑原因的情况下,它是什么?
解决方法
我个人更喜欢使用Assert.AreEqual(true,InstanceA.Equals(InstanceB)),因为这肯定会使用你的Equals方法;当然这假设你已经对你的Equals方法进行了单元测试,并且100%确定它有效:)
至于Assert使用object.Equals的原因,我想我们不得不问这个类的设计者:)但我想有一个原因是如果你的Equals方法有问题,你的测试结果就不好了.
c# – 将double与0进行比较是错误的:doubleVariable == 0?
double doubleVariable=0.0; if (doubleVariable==0) { ... }
或者这个代码会受到潜在的四舍五入问题的困扰?
解决方法
你最好还是阅读关于浮点数的讨论,这里是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, 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() 是细粒度的,我可以尝试使用 prediction
将 VectorAssembler
列转换为向量,但事实并非如此。
有人知道如何解决这个问题吗?
解决方法
您可以使用 MulticlassClassificationEvaluator
。您只有一个标签作为整数,因此使用多标签评估器没有意义。
double equals vs在python中
我在Python解释器中运行以下命令:
>>> foo = 10>>> dir(foo) == dir(10)True>>> dir(foo) is dir(10)False>>>
为什么是这样?
答案1
小编典典is
检查2个参数引用相同的对象,并==
检查2个参数具有相同的值。dir()
返回一个list
包含两个相同的数据foo
和10
,而实际list
的事情2实例是不同的。
关于assertEquals和Double,Double和assertEquals的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于c# – Assert.AreEquals调用object.Equals而不管IEquatable实现如何、c# – 将double与0进行比较是错误的:doubleVariable == 0?、CrossValidator.fit() - IllegalArgumentException:列预测的类型必须等于 ... [array
本文标签: