gpt4 book ai didi

Groovy 和 Spock : toDouble vs toFloat

转载 作者:行者123 更新时间:2023-12-02 04:50:21 25 4
gpt4 key购买 nike

我有这个代码:

static def parseString(String inputRow, Particle particle) {
def map = inputRow.split()
particle.mass = map[0].toDouble()
particle.x = map[1].toDouble()
particle.y = map[2].toDouble()
}

还有这个测试代码:

static final inputRow = "1 -5.2 3.8"
def particle1 = new Particle()

def "string should be parsed into particles"() {
when:
RepulsionForce.parseString(inputRow, particle1);

then:
particle1.mass == 1
particle1.x == -5.2
particle1.y == 3.8
}

以上测试按原样通过; 然而,当我将 parseString 代码更改为以下代码时:

static def parseString(String inputRow, Particle particle) {
def map = inputRow.split()
particle.mass = map[0].toFloat()
particle.x = map[1].toFloat()
particle.y = map[2].toFloat()
}

同一测试失败并出现此错误:

Condition not satisfied:

particle1.x == -5.2
| | |
| | false
| -5.2
Particle@a548695

最佳答案

默认情况下,Groovy 中的 -5.2 是一个 BigDecimal,因此您将 Bi​​gDecimal 与 Float 对象进行比较。这些通行证:

def a = -5.2
def b = "-5.2".toFloat()
assert a != b
assert a.getClass() == BigDecimal
assert b.getClass() == Float
assert a.toFloat() == b

Groovy 接受 BigDecimal 和 Double 之间的比较:

def g = -5.2
def h = "-5.2".toDouble()
assert g == h
assert g.getClass() == BigDecimal
assert h.getClass() == Double

如果您需要进行一些需要精确度的计算,您最好使用 BigDecimal,因为它们保留了它(尽管以性能成本为代价)

def c = -5.2
def d = "-5.2".toBigDecimal()
assert c == d
assert c.getClass() == BigDecimal
assert d.getClass() == BigDecimal

否则,根据@Tim 的评论,使用 -5.2f,因此比较是针对 Float 对象进行的:

def e = -5.2f
def f = "-5.2".toFloat()
assert e == f
assert e.getClass() == Float
assert f.getClass() == Float

关于Groovy 和 Spock : toDouble vs toFloat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18962842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com