Безопасно округляйте числа в php, используя строки, чтобы избежать злого плавания - PullRequest
0 голосов
/ 29 июня 2019

Я использую bcmath для своих расчетов и хочу округлить некоторые числа до n десятичных знаков.Теперь я знаю достаточно, чтобы избежать операций с плавающей точкой, но мне интересно, если следующий пример безопасен и / или есть ли лучшие способы сделать это?

$number = '123.456'; // number to round as string
$roundedNumber = (string) round($number, 2); // round and cast
// calculations using bcmath continue here...

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

Или есть лучший способ сделать это?

РЕДАКТИРОВАТЬ: перед тем, как ответить:

bc* функции не round когда указан третий параметр, они просто обрезают выходной сигнал.

number_format не позволяет выбрать режим округления, поэтому он отсутствует

EDIT:Что я считаю безопасным?

Учитывая число в виде строки и режима округления, будет ли функция всегда выводить правильный / ожидаемый результат и не будет зависеть от приведения к плавающей запятой?Я предполагаю, что я боюсь следующего: я предоставляю число, скажем, 12.345 в виде строки для round функции, оно преобразуется в float, и тогда мой номер больше не 12.345, это может быть 12.345xxxx, потому что мывсе знают, как float может быть представлено внутри.Я боюсь, что это повлияет на результат округления.Я полагаю, что когда я приведу 12.345 к струне, никакого вреда не будет, это всегда будет 12.345, а не 12.345 .... правильно?

...