gpt4 book ai didi

Swift:双重转换不一致。如何正确比较 double ?

转载 作者:搜寻专家 更新时间:2023-10-31 22:00:37 24 4
gpt4 key购买 nike

我有一个非常简单的函数可以将温度从 ˚C 转换为 ˚K。

func convertKelvinToCelsius(temp:Double) ->Double {
return temp - 273.15
}

我有一个单元测试来驱动这个功能。这就是问题所在:

  func testKelvinToCelsius(){
var check1 = conv.convertKelvinToCelsius(200.00) // -73.149999999999977
var check2 = 200.00 - 273.15 // -73.149999999999977
var check3 = Double(-73.15) // -73.150000000000006

//Passes
XCTAssert(conv.convertKelvinToCelsius(200.00).description == Double(-73.15).description, "Shoud convert from celsius kelvin")

//Fails
XCTAssert(conv.convertKelvinToCelsius(200.00) == Double(-73.15), "Shoud convert from celsius kelvin")
}

当你添加一个断点并检查check1、check2和check3的值时,它们很有趣:

check1  Double  -73.149999999999977
check2 Double -73.149999999999977
check3 Double -73.150000000000006

问题:

  1. 为什么 Swift 会为 check1/check2 和 check3 返回不同的值

  2. 我怎样才能让第二个测试通过,因为写它就像我做 test1 一样。为什么必须将 Double 转换为 String 才能比较它们?

  3. 最后,当我println check1、check2 和check3 时,它们都打印为“-73.15”。为什么?为什么不准确地打印,而不是混淆程序员!?

重现:

只需在 Playground 上输入 200 - 273.15 == -73.15 并观察它变为 false!!

最佳答案

这是浮点值的预期行为。 They cannot be 100% accurately represented.

您可以使用 XCTAssertEqualWithAccuracy 函数断言浮点值彼此在给定范围内。

println 为所有打印相同值的原因是因为它在内部将它们四舍五入到两位小数(我假设)。

关于Swift:双重转换不一致。如何正确比较 double ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28947289/

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