2016-07-12 7 views
-4

Я новичок в быстрой (с использованием быстрого 2.2), и я вижу проблему, где 200.23 - 200 показано равным 0.2299999999999898. Я знаю, что компьютеры не могут точно представлять иррациональные числа, но я не понимаю, почему рациональное число также не представляется правильно. Это влияет на выходные номера, созданные моей программой, что приводит к проблемам.Видя ошибки округления (например, 0.22999999 вместо 0.23) в Swift 2.2

Вот пример кода площадка (очень простая версия часть моего фактического кода) показывает такое поведение:

var number:Double = 200.23    //Number I'm testing 

var left: Double = floor(number) // Extracting integer part 
var right: Double = number-left // Extracting fraction part 

В приведенном выше коде я определяю номер, а затем извлекая его целиком и дробной части , Дробная часть должна быть 0.23, однако она показана как 0.2299999999999898 на игровой площадке Swift.

Аналогично, если изменить исходное число от 200.23 до 100.23, то дробная часть показано, что 0.230000000000004

Как я могу решить эту проблему?

EDIT:

Я спросил о контексте этой проблемы. Я разрабатываю приложение статистики, которое часто использует числа и на самом деле имеет небольшой встроенный калькулятор. Поэтому, если я попытаюсь вычислить 200.23 - 0.23 и увидит что-нибудь, кроме 0,23, он будет удивлен!

+0

Как я уже говорил выше, я уже знаю проблему с плавающей точкой. Но как я могу обойти это? Конечно, все программное обеспечение, написанное сегодня, каким-то образом справляется с этой проблемой. – Ahmad

+2

«Я знаю, что компьютеры не могут точно представлять иррациональные числа, но я не понимаю, почему рациональное число также не представляется правильно». Это неверно: компьютеры не могут точно представлять * все * рациональные числа. И десятичные обозначения (люди) также не могут обозначать иррациональные числа. – Evert

+0

Просто используйте целые числа, 1.23 означает 123, 836.92 означает 83692 – Kametrixom

ответ

0

Для округления значений, хранящихся в переменной right, просто используйте функцию round(). Чтобы уточнить точность, просто сделайте это

var number:Double = 200.23     

var left: Double = floor(number) 
var right: Double = number-left 

let roundedValue = round(right*100)/100 // Answer will be 0.23 
+0

округление предлагает приближенное решение, которое, к сожалению, не работает для меня, потому что округление может иногда приводить к неправильным ответам (когда тестирование экстремальных случаев), а также требует, чтобы я динамически выяснял, какое приближение мне нужно для данного расчета, у которого есть собственное бремя. Спасибо за предложение ответа. – Ahmad