Несогласованность преобразования десятичного числа в двойное (Цель C) - PullRequest
0 голосов
/ 30 августа 2018

XCode 9.4.1. В консоли отладчика я вижу странные результаты:

(lldb) print (double)0.07
(double) $0 = 0.070000000000000007
(lldb) print [(NSDecimalNumber*)[NSDecimalNumber decimalNumberWithString:@"0.07"] doubleValue]
(double) $1 = 0.069999999999999993

Те же результаты, что и при выполнении в скомпилированном коде. Я не понимаю, почему результат отличается при преобразовании литерала 0,07 в удвоение и при преобразовании десятичного 0,07 в удвоение. Почему точность теряется по-другому?

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Значения рассчитываются по-разному

(lldb) p 7.0 / 100.0
(double) $0 = 0.070000000000000007
(lldb) p 7.0 / 10.0 / 10.0
(double) $1 = 0.069999999999999993
0 голосов
/ 30 августа 2018

NSDecimalNumber разработан так, чтобы вести себя точно так же, как вы видите. Он использует «математику с основанием 10», чтобы избежать той самой проблемы, которую вы видите - традиционное представление чисел с плавающей запятой не может точно представлять базовые 10 чисел, которые мы привыкли писать.

Комментарий, инструктирующий вас «изучать численные методы», немного дерзкий, но он движется в правильном направлении. Лучшее использование вашего времени было бы (также) взглянуть на документацию для NSDecimalNumber и подумать о том, что она делает и почему она существует.

Я никогда не слышал о NSDecimalNumber пару минут назад, так что спасибо, что подсказали мне новые знания. : -)

...