Ошибка Laravel при печати двойного поля из базы данных - PullRequest
2 голосов
/ 18 октября 2019

У меня проблема с laravel или php (пока не знаю), проблема в следующем:

В моей базе данных есть поле с именем debe, значение которого составляет 3.97, как вы можете видетьниже. Это поле является double(11,2).

sql table row

Когда я получаю доступ к этому полю в моей платформе, например, используя dd(), оно возвращает значение правильно, как вы можете видеть ниже.

dd result

Основная проблема возникает, когда я пытаюсь распечатать в виде, я получаю следующее:

value printed

Я не знаю, почему это происходит, но сейчас единственное решение, которое я нашел, - это округлить значение с помощью функции PHP round().

С уважением

1 Ответ

3 голосов
/ 18 октября 2019

Отметьте эту статью в официальной документации:

Числа с плавающей точкой имеют ограниченную точность. Хотя это зависит от системы, PHP обычно использует формат двойной точности IEEE 754, который даст максимальную относительную ошибку из-за округления порядка 1.11e-16. Неэлементарные арифметические операции могут давать большие ошибки, и, конечно, распространение ошибок должно учитываться при сложении нескольких операций.

Кроме того, рациональные числа, которые точно представимы как числа с плавающей запятой в базе 10, например, 0,1 или0,7, не имеют точного представления в виде чисел с плавающей точкой в ​​базе 2, которая используется внутри, независимо от размера мантиссы. Следовательно, они не могут быть преобразованы в их внутренние двоичные аналоги без небольшой потери точности. Это может привести к сбивающим с толку результатам: например, floor ((0.1 + 0.7) * 10) будет обычно возвращать 7 вместо ожидаемых 8, поскольку внутреннее представление будет примерно таким: 7.9999999999999991118 ....

Такникогда не доверяйте результатам с плавающей запятой последней цифре и не сравнивайте числа с плавающей запятой непосредственно на равенство. Если требуется более высокая точность, доступны математические функции произвольной точности и функции gmp.

Вы можете использовать функции round или number_format, чтобы получить требуемые десятичные дроби

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...