PHP Десятичные вычисления - PullRequest
1 голос
/ 14 июля 2010

Я читал, что вы должны быть осторожны со сравнениями с плавающей точкой и вычислениями в PHP.Я не эксперт в PHP, поэтому я решил спросить сообщество, каков наилучший способ выполнения точных десятичных вычислений в PHP.

Я разрабатываю приложение с временной картой, в котором оно вычисляет все время, введенное длянеделя.Все, что превышает 40 часов, считается сверхурочным.Затем я хочу распределить это сверхурочное время по каждой записи времени, основываясь на проценте от общей записи.

Пример:

Понедельник = 10 часовОбщее время = 50 часовОбщее сверхурочное время = 10 часов

Процент общего времени (0,2) = понедельник (10 часов) / общее время (50 часов)Сверхурочное время для выделения на понедельник (2 часа) = Общее сверхурочное время (10 часов) * Процент от общего времени (0,2)

Теперь создайте новую запись для понедельника с 2 часами сверхурочных и вычтите 2 часа из исходной записи.

Новые записи:Понедельник (8 часов) = понедельник - Сверхурочные, чтобы выделить на понедельник (2 часа)Понедельник сверхурочные = 2 часа

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

Ответы [ 3 ]

1 голос
/ 14 июля 2010

Чтение Руководство с плавающей запятой , чтобы понять, почему именно вы должны быть осторожны со смешиванием чисел с плавающей запятой и понятием "десятичные числа" (которое абсолютно не имеет ничего общего с PHP).1003 *

Также имеется шпаргалка для PHP .

1 голос
/ 14 июля 2010

Вы можете использовать математику с фиксированной точкой. Так, например, если ваши значения должны быть с точностью до одного цента, тогда используйте один цент в качестве единицы, а затем вы можете использовать значение 1234 для представления 12,34 и т. Д.

Вы все равно обнаружите, что некоторые операции, включая деление, могут возвращать значение с плавающей запятой. Вы просто должны решить, что делать с остатком в любом случае. Например, если у вас есть 1,04 и вы делите это на 5, результат должен быть равен 0,21 (округлен в большую или меньшую сторону) или 0,20 (округлен в меньшую сторону) и т. Д. Затем преобразовать обратно в целое число, используя round, ceil или floor.

0 голосов
/ 14 июля 2010

Думаю, вам лучше взглянуть на библиотеку BCMath lib / functions: http://php.net/manual/en/book.bc.php

...