Цель C - iOS - Странное поведение fmod () - PullRequest
1 голос
/ 29 июля 2011

Кто-нибудь может мне помочь объяснить следующее? Вы можете ввести те же цифры в Google и получить те же результаты, что и я в коде ....

1089.80 % 0.04 = 0
1089.84 % 0.04 = 0.04 - Surely this is wrong? 0.04 goes into 1089.84 with no remainder.
1089.88 % 0.04 = 0
1089.92 % 0.04 = 0

Похожее поведение проявляется и для других чисел, которые, похоже, должны быть правильными.

Заранее спасибо!

Ответы [ 2 ]

4 голосов
/ 29 июля 2011

Вы смотрите на округленные значения.Внутренне это не 1089.84, а что-то вроде 1089.84000026.

Если вы хотите «правильные» значения, умножьте обе стороны на 100, добавьте 0,5 и (int) их, затем возьмите целочисленный мод и преобразуйте результатназад, чтобы плавать.

3 голосов
/ 01 августа 2011

Действительно, 0,04 входит в 1089,84 без остатка.Однако это не те вычисления, которые вы просите выполнить за вас.

Ни 1089.84, ни 0.04 не могут быть представлены в виде числа с плавающей запятой.Таким образом, каждый из литералов двойной точности округляется до ближайшего представимого значения.На самом деле вы вычисляете:

1089.839999999999918145476840436458587646484375 % 0.040000000000000000832667268468867405317723751068115234375

, что в точности равно

0.039999999999895459457111002166129765100777149200439453125

, когда вы печатаете результат, он округляется до нескольких десятичных знаков для отображения, и вы видите0.04.

...