1

У меня есть несколько расчетов на стороне клиента с JavaScript.PHP floatval странный парсинг

var total = (((3 * 24)/100) + 3); // результат 3.7199999999999998

Мне нужно сохранить этот номер 3.7199999999999998 в базе данных, как есть. База данных находится на MySQL, я использую Doctrine 2 для ORM, а сущность имеет точность, равную /** @Column(type="decimal", precision=32, scale=16, nullable=false) * */, но после сохранения я вижу, что в базе данных есть только номер 3.72, wtf? После некоторой проверки я обнаружил, что доктрина использует floatval, и после выполнения этого floatval(3.7199999999999998) вы получаете 3.72 !! Зачем?

Есть ли обходной путь для этого? как сказать доктрину, чтобы не использовать floatval и хранить значение как есть? также я не хочу использовать varchar для этого столбца.

Заранее благодарен!

+0

Я не эксперт по доктрине2. но вы не можете изменить тип данных tp 'double'.? –

+0

нет, я не могу. результат тот же '3.72' – Constantin

ответ

1

3.72 Фактически правильное значение. Похоже, что JavaScript выполняет точность при выполнении этого расчета.

+0

Тогда как вернуть' 3.7199999999999998' номер от '3.72' в JavaScript? Потому что с этим раундом я получаю больше ошибок, используя '3.72'. – Constantin

+0

@Constantin Не знаете, почему вы хотите неправильное значение – phuzi

+0

Мне нужно вернуть этот неправильный номер, потому что мне нужно рассчитать процент позже и всегда быть одинаковым. – Constantin

2

3.72 - правильное значение. Результат 3.7199999999999998 обусловлен неточностями с плавающей запятой в JavaScript (см.: How to deal with floating point number precision in JavaScript?). Я бы предложил использовать toFixed() в вашем JavaScript-коде, чтобы этого избежать.

var total = (((3 * 24)/100) + 3).toFixed(2); 
+0

Итак, поскольку JavaScript разбит, я должен избегать точности 16 цифр и использовать только точность 2 цифры? И что делать, если мне нужна более высокая точность? – Constantin

+0

Если вам нужна более высокая точность, используйте [BigDecimal library for JavaScript] (https://github.com/dtrebbien/BigDecimal.js) или [big.js] (https://github.com/MikeMcl/big.js) – AlliterativeAlice

 Смежные вопросы

  • Нет связанных вопросов^_^