Вычисления Десятичного числа PHP

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

Я разрабатываю timecard приложение, где оно вычисляет все время вводимый на неделю. Что-либо более чем 40 часов считают сверхурочным временем. Я затем хочу распределить то сверхурочное время назад через каждый раз запись на основе процента, что запись имеет общее время.

Пример:

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

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

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

Новые записи:
В понедельник (8 часов) = в понедельник - Сверхурочное время для Выделения понедельнику (2 часа)
В понедельник Сверхурочное время = 2 часа

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

1
задан Dale 14 July 2010 в 13:31
поделиться

3 ответа

Прочитайте The Floating-Point Guide, чтобы понять, почему именно вы должны быть осторожны со смешиванием чисел с плавающей точкой и концепцией "десятичных дробей" (которая не имеет абсолютно никакого отношения конкретно к PHP).

Здесь также есть шпаргалка по PHP.

1
ответ дан 2 September 2019 в 23:03
поделиться

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

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

1
ответ дан 2 September 2019 в 23:03
поделиться

Я думаю, вам лучше посмотреть на либ/функции BCMath: http://php.net/manual/en/book.bc.php

0
ответ дан 2 September 2019 в 23:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: