Должен ли я использовать BCMath для значений с 1,2 или 3 десятичными?
У меня около 10-15 чисел с точностью до 1, 2 или 3 десятичных знаков в моей БД, как со знаком, так и без знака.
Пример используемых типов данных:
decimal(10,3), decimal(10,2), decimal(10,1)
Я вычисляю их в PHP примерно так:
$result = ($value1from_col1 + ($value2from_col2 * 30)/500) * 0.453;
Я тогда использую некоторые round()
функции как это:
$result_round = round($result, 2, PHP_ROUND_HALF_UP);
Результат $result_round
будет не более 100 000 999
Я проверяю это: насколько точность для PHP-библиотеки bcmath? и в ответе говорится, что это не будет проблемой, если вы не используете такие функции, как round(), printf и т. д.
Должен ли я использовать BCMath-расширение? (только потому, что я использую round()
)
1 ответ
Некоторые общие числа не могут быть представлены точно в двоичном виде (под общим, я имею в виду, что они часто встречаются в человеческих системах, очевидно, само по себе это бессмысленная концепция). Например, 0,1, 0,2. Чтобы понять некоторые проблемы, связанные с двоичным fp, взгляните на этот вопрос. Почему десятичные числа не могут быть представлены точно в двоичном формате?
Для многих распространенных приложений двоичный метод с плавающей точкой является неправильным выбором. Например, денежные расчеты будут "неправильными", потому что мы, как люди, рассчитываем считать в десятичном виде до заранее определенного числа десятичных знаков (2 в случае денег). Ошибки округления, вызванные использованием бинарного fp в финансовых расчетах, могут даже стать причиной кражи!
bcmath реализует десятичную FP и поэтому является более безопасным выбором.
Для измерения значений реального мира, например, в научном эксперименте, подходит двоичный FP.
Если вы думаете, что храните фиксированное количество десятичных точек, то вам, вероятно, нужен bcmath, а не стандартная двоичная с плавающей запятой. Также проверьте представление вашей базы данных и используйте там десятичный тип, если вы используете bcmath.