Проблема с плавающей запятой - PullRequest
1 голос
/ 23 октября 2019

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

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

// incrementing 0, with 0.1, 11 times, returns 1.0999999999999999
Math.round( 1.0999999999999999 * 100 + Number.EPSILON ) / 100 

Это возвращает правильное число ... поэтому мне интересно, не может ли это быть реализовано внутри методачто связано с увеличением действительного значения внутри Firestore?

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

number.toLocaleString( undefined, { minimumFractionDigits: 2 })

Это будет показывать 1.09, которыйнеправильно, и клиенты запутываются в своих доходах.

Что нужно сделать, кроме манипулирования данными после получения их на стороне клиента?

Еще один побочный эффект этого заключается в том, что при увеличении большого отрицательного значениязначение, иногда, по какой-то причине, вы получаете это +e внутри вашего значения в Firestore и при извлечении его на стороне сервера (по крайней мере,h в PHP Admin SDK) число заканчивается строкой, а не целым числом.

1 Ответ

0 голосов
/ 23 октября 2019

Согласно документации Cloud Firestore хранит числа с плавающей запятой в формате IEEE 754 . Пожалуйста, найдите время, чтобы понять, что подразумевает этот формат. По сути, вы не можете рассчитывать на число с плавающей запятой для сохранения точности, которую вы указали, поскольку формат не может этого сделать для некоторых чисел. Вы можете ожидать небольшого изменения, когда число сохраняется. Хорошую сводку этого типа поведения можно найти здесь, в Переполнении стека:

Если выВы должны сохранять точность чисел, изучите возможность использования библиотеки, которая поможет загружать и хранить числа с нужной вам точностью. Практически все финансовые приложения будут делать что-то подобное, так как IEEE 754 может эффективно потерять данные, чтобы сжать их до небольшого размера.

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