В PHP я пишу приложение, которое требует точности до 2 цифр справа от десятичной точки для валюты (например: я забочусь о 1.23 === 1.23
но не более правых цифр).
Мне известно, что с плавающей точкой обычно считается плохой практикой, потому что они неточны со значениями, основанными на характере преобразования из основания 2 в основание 10 справа от десятичной точки. Тем не менее, в моем исследовании наилучшей практики работы с валютными значениями я обнаружил некоторые аргументы, что float не годится, если вам нужна точность, превышающая целые значения цента. Я явно не нуждаюсь в большей точности, чем все значения цента.
Итак, мои вопросы:
bcmath
библиотека?bcmath
lib, я должен хранить значения в базе данных MySQL как строки или decimal
что поддерживает MySQL?Спасибо!
После дальнейших раскопок я нашел решение на Должен ли я использовать BCMath для значений с 1,2 или 3 десятичными?
Согласно принятому ответу на данный пост, не может быть гарантировано число с плавающей запятой для любой точности справа от десятичной точки.
Что касается хранения в БД, кажется, что хранить его в виде строки было бы самым простым вариантом, так как bcmath
lib работает со строками.
Используйте это, чтобы урезать до двух знаков после запятой без округления.
<?php
$a = 12.37675;
$a = floor($a * 100) / 100; // 12.37
echo $a;
или же
<?php
function dollar($value) {
return floor($value * 100) / 100;
}
$a = 12.37675;
echo dollar($a);