我有一个非常简单的功能,可将温度从˚C转换为˚K.
func convertKelvinToCelsius(temp:Double) ->Double {
return temp - 273.15
}
Run Code Online (Sandbox Code Playgroud)
我有一个单元测试来驱动这个功能.这就是问题所在:
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")
}
Run Code Online (Sandbox Code Playgroud)
当你添加一个断点并检查check1,check2和check3的值时,它们非常有趣:
check1 Double -73.149999999999977
check2 Double -73.149999999999977
check3 Double -73.150000000000006
Run Code Online (Sandbox Code Playgroud)
问题:
为什么Swift为check1/check2和check3返回不同的值
我怎样才能通过第二次测试,因为写它就像我测试1一样.为什么我必须将双打转换为字符串才能比较它们?
最后,当我printlncheck1,check2和check3时,它们都打印为'-73.15'.为什么?为什么不准确打印,而不是混淆程序员!?
重现:
只需输入200 - 273.15 == -73.15 您的游乐场并观看它false!
这是浮点值的预期行为.它们不能100%准确地表示.
您可以使用该XCTAssertEqualWithAccuracy函数来断言浮点值在彼此的给定范围内.
println打印相同值的原因是因为它内部将它们舍入为两位小数(我假设).
| 归档时间: |
|
| 查看次数: |
2255 次 |
| 最近记录: |