У меня есть двойной такт, и к каждой доле в моей «песне» я добавляю еще один дубль. Когда $ measure увеличивается на целое число, я хочу распечатать эту новую меру.
Кажется, что PHP хочет округлить эти значения, чтобы двойное изображение выглядело для меня приятным. Вот пример распечатки, которую я получаю:
Размер: 17 Этаж: 16 Округление: 16
из кода:
echo "Measure: " . floatval($measure) . "Floor: " . floor($measure) . " Rounded: " . $roundMeasure . " ";
Кажется, что $ measure на самом деле содержит 16.99999999 или какое-то подобное значение. Есть ли способ прочитать его фактическое содержание? И еще лучше, есть ли способ использовать систему округления PHP, чтобы я мог просто взять 17? Спасибо.
Возможный дубликат Математика с плавающей запятой не работает?
Это похоже, но я специально спрашиваю, почему / как PHP выводит округленную переменную, когда она на самом деле не округляется, и есть ли способ работать с двумя разными значениями.
покажите откуда берется $measure?
$ measure начинается с 1 до начала цикла, затем для каждой итерации добавляется еще одно значение double. Добавленная стоимость обычно составляет 1/3, 1/6 и т. д.






better yet, is there any way to use PHP's rounding system so I can just grab the 17
Обычно вы используете арифметику с фиксированной запятой, например, используя 64-е, а затем конвертируете на выходе.
Или вы можете проверить, увеличилась ли мера значения, отличного от ее floor (), менее чем, скажем, на 0,00001.
В общем случае никогда следует полагаться на значение с плавающей запятой, имеющее «точное» значение - скорее всего, это не будет.
В качестве временной меры вы можете изменить точность в php.ini:
; The number of significant digits displayed in floating point numbers.
; http://php.net/precision
precision = 17
В противном случае вы можете перейти к BCMath:
For arbitrary precision mathematics PHP offers the Binary Calculator which supports numbers of any size and precision up to 2147483647 (or 0x7FFFFFFF) decimals, if there is sufficient memory, represented as strings.
Как ни странно, дробные степени 2 (с точностью до точки) на самом деле делать имеют точное значение с плавающей запятой, поскольку они являются степенью 0b0.1.
Хороший вопрос. Раньше я не знал об этой ошибке / функции / проблеме в php.
Вот мой подход к ее решению:
echo "Measure: "
. floor($measure).'.'
. sprintf("%04d",floor(($measure*10000)-floor($measure)*10000)) ."\n";
Вы можете изменить 1000 на любую нужную вам точность.
И имейте в виду, что этот трюк работает и для положительных значений. Вам необходимо адаптировать его, если у вас могут быть и отрицательные значения.