У меня есть очень простая функция для преобразования температуры от ˚C TO ˚K.Swift: несогласованность двойного преобразования. Как правильно сравнивать парные пары?
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
Вопросы:
Почему Swift возвращает разные значения для проверки1/check2 и check3
Как можно Я получаю второй тест, чтобы пройти, потому что писал его, как будто я испытал запахи test1. Зачем мне нужно преобразовывать парные разряды в строки, чтобы иметь возможность сравнивать их?
Наконец, когда я
println
check1, check2 и check3, все они печатаются как '-73.15'. Зачем? Почему бы не печатать точно, а не путать программистов !?
Репродуцировать:
Просто введите 200 - 273.15 == -73.15
в вас площадка и смотреть его идти false
!!
[Что каждый компьютерный ученый должен знать о арифметике с плавающей точкой] (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html). –
Возможный дубликат [Сбой с плавающей запятой?] (Http://stackoverflow.com/questions/588004/is-floating-point-math-broken). - Даже если этот вопрос был первоначально о JavaScript, проблема такая же, как у C или Swift (и многих других языков). –