Как исправить это 7%, где 6%, 5% отлично работает - PullRequest
0 голосов
/ 26 декабря 2010

Случай 1 (скидка 6%):

Subtotal:   750.00
Discount:   45.00
Handling cost:  24.32
21% VAT:    0.00
Total (this is the amount you will deposit):    729.32

Случай 2 (скидка 7%):

Subtotal:   1250.00
Discount:   87.50
Handling cost:  39.88
21% VAT:    0.00
Total (this is the amount you will deposit):    1202.38 

Где я применяю эту формулу:

(729.32  - 0.35) / 1.034/ 0.94   =  750.00    (<<--- CORRECT ) ?

(1202.38 - 0.35) / 1.034/ 0.93   = 1250.01    (<<--- My problem why not 1250.00) ?

Как исправить 7% формулу, чтобы получить ровно 1250,00?Вместо дробной ошибки.

Ответы [ 2 ]

1 голос
/ 26 декабря 2010

Было бы очень полезно узнать, где вы получили исходную формулу, и что вы ожидаете от каждой части. На самом деле я был вынужден проделать дополнительную работу, чтобы понять, как константы в вашей формуле соотносятся с затратами, указанными в вашем примере.

Ваши расходы на обработку рассчитываются по формуле:

0.35 + (subtotal - discount) * 0.034

Я не знаю, почему существует 0,35.

Ваша скидка рассчитывается по формуле:

subtotal * discount rate, (where discount rate has already been converted to a decimal)

Общая сумма рассчитывается по формуле:

subtotal + handling costs - discount

После написания этого и некоторых размышлений я собираюсь догадаться, что вы хотите сделать обратный расчет для определения промежуточного итога, когда известны только ставки и промежуточный итог. Давайте начнем с того, что мы знаем, а затем изменим формулу по мере необходимости.

subtotal = total + discount - handling costs
subtotal = total + subtotal * discount rate -  (0.35 + (subtotal - discount) * 0.034)
subtotal (1 - discount rate) = total - (0.35 + subtotal - subtotal * discount rate) * 0.034
subtotal (1 - discount rate) = total - 0.35 - subtotal (1 - discount rate) * 0.034
subtotal (1 - discount rate) + subtotal (1 - discount rate) * 0.034 = total - 0.35
subtotal (1 - discount rate) (1 + 0.034) = total - 0.35
subtotal (1 - discount rate) * 1.034) = total - 0.35
subtotal = (total - 0.35) / ((1 - discount rate) * (1.034))

Итак, хорошая новость в том, что я придумал то же математическое уравнение, что и вы, и теперь по большей части понимаю, как вы к нему пришли. Плохая новость заключается в том, что при пробивании чисел для случая №2 все еще остается одна сотая.

Эта небольшая ошибка связана с тем, что мы имеем дело с округленными числами. Когда стоимость обработки и скидка первоначально рассчитываются, они округляются до ближайшей сотой. Это можно рассматривать как ошибку округления. Когда они складываются вместе, ошибка округления становится больше. Это нормальный побочный продукт при работе с процентами и ценами.

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

Моя собственная математика недостаточно хороша, чтобы предсказывать и исправлять ошибки округления в формуле. Тем не менее, у меня есть предложение, как это обнаружить и исправить после факта. После вычисления обратного промежуточного итога это число можно использовать для прямого расчета. Если элементы не складываются, как они должны, примените «фактор выдумки» и попробуйте снова. Повторите по мере необходимости. Это грязно и не особенно элегантно, но должно работать.

Надеюсь, это поможет.

0 голосов
/ 26 декабря 2010

Я думаю, что это просто стандарт IEEE для операций с плавающей запятой.Есть инструмент для отображения того, что на самом деле происходит:

http://www.h -schmidt.net / FloatApplet / IEEE754.html

...