Печать истинных значений удвоений в PHP?

У меня есть двойной такт, и к каждой доле в моей «песне» я добавляю еще один дубль. Когда $ measure увеличивается на целое число, я хочу распечатать эту новую меру.

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

Размер: 17 Этаж: 16 Округление: 16

из кода:

echo "Measure: " . floatval($measure) . "Floor: " . floor($measure) . " Rounded: " . $roundMeasure . " ";

Кажется, что $ measure на самом деле содержит 16.99999999 или какое-то подобное значение. Есть ли способ прочитать его фактическое содержание? И еще лучше, есть ли способ использовать систему округления PHP, чтобы я мог просто взять 17? Спасибо.

float-point-gui.de
user9487972 21.05.2018 00:10

Возможный дубликат Математика с плавающей запятой не работает?

user9487972 21.05.2018 00:11

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

SchweeDubulus 21.05.2018 00:13

покажите откуда берется $measure?

Alex 21.05.2018 00:13

$ measure начинается с 1 до начала цикла, затем для каждой итерации добавляется еще одно значение double. Добавленная стоимость обычно составляет 1/3, 1/6 и т. д.

SchweeDubulus 21.05.2018 00:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
41
2

Ответы 2

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.

Ignacio Vazquez-Abrams 21.05.2018 00:52

Хороший вопрос. Раньше я не знал об этой ошибке / функции / проблеме в php.

Вот мой подход к ее решению:

https://ideone.com/JgDDvo

echo "Measure: " 
     . floor($measure).'.'
     . sprintf("%04d",floor(($measure*10000)-floor($measure)*10000)) ."\n";

Вы можете изменить 1000 на любую нужную вам точность.

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

Другие вопросы по теме