2013-07-09 4 views
-1

В настоящее время у меня есть 2 двухместных номера, одна цена с налогом и процент налога.Неожиданное поведение при умножении в объекте-c

Цена: 9,79 (Bascially 11, но без налога) налога: 11%

Теперь то, что мне нужно сделать, чтобы получить цены включительно налог снова, так что я делаю это:

// Tax exclusive test 
double taxRate = 0.11; 
double priceWithTax = 11; 
double priceWithoutTax = priceWithTax * (1.0 - taxRate); 

NSLog(@"priceWithoutTax = %f", priceWithoutTax); 

double result = priceWithoutTax * (1 + taxRate); 

NSLog(@"Result: %f", result); 

Но затем после выполнения мой выход это:

priceWithoutTax = 9.790000 
Result: 10.866900 

Ожидаемый результат будет 11 снова. Если бы кто-нибудь мог помочь, это было бы замечательно, я проверил множество источников вокруг точности float, но я не могу найти ответ.

Заранее благодарен!

UPDATE (новый код после ответа по Вирсавии)

// Tax exclusive test 
double taxRate = 0.11; 
double priceWithTax = 11; 
double priceWithoutTax = priceWithTax * (1.0 - taxRate); 

NSLog(@"priceWithoutTax = %f", priceWithoutTax); 

double result = priceWithoutTax/(1 - taxRate); 

NSLog(@"Result: %f", result); 

Результат:

priceWithoutTax = 9.790000 
Result: 11.000000 

ответ

3

Вашей математика неверна: вам нужно double result = priceWithoutTax/(1.0 - taxRate);.

Справедливо, что точность чисел с плавающей запятой может быть виновата только в ошибках в 14-й значащей цифре (для двойного).

+0

Хорошо, попробуйте сейчас, обновим вопрос, когда попробуем :) –

+0

Это работает !!!! Благодаря!! Ты определенно герой сегодняшнего дня! –

+0

Я приму свой ответ, но могу только через 8 минут ... –

3

Ответы Вирсавии неверны. Его результат дает вам последовательные ответы, но в вашем вопросе говорится, что вы пытаетесь взять цену, которая включает в себя налог, и рассчитать цену этого предмета без налога. Для этого математика Батшебы неверна.

double result = priceWithoutTax * (1 + taxRate); - это правильный способ расчета priceWithTax.

E.g. рубашка, которая стоит $ 10, не включая налог плюс налог на 5% будет стоить вам в общей сложности $ 10,50

double priceWithoutTax = priceWithTax * (1.0 - taxRate); является неправильно формула для расчета priceWithoutTax от priceWithTax. Используя тот же пример с рубашкой $ 10, подключение этой формулы даст вам priceWithoutTax = $10.50 * (1.0 - 0.05) = $9.975. Вы знаете, что это неправильный ответ, потому что вы знаете, что рубашка стоит ровно 10 долларов без налога.

Правильный способ расчета priceWithoutTax: double priceWithoutTax = priceWithTax/(1.0 + taxRate);

Перепроверьте с рубашкой снова. priceWithoutTax = $10.50/(1.0 + 0.05) = $10

+1

Да, я согласен.Мой ответ был скорее о том, чтобы согласовать неожиданный результат с этим результатом первого вычисления и отклонить идею, что это может быть связано с точностью с плавающей запятой: я не обращал внимания на цель начального вычисления; информация о том, что действительно хотел сделать ОП, можно почерпнуть из тщательно отобранных имен переменных и комментариев к программе (это может быть уроком для всех нас). Следовательно, +1 и предложите ОП внимательно изучить этот ответ. – Bathsheba

Смежные вопросы