Я работаю над несколькими маленькими десятичными знаками, такими как 0,0000687, 0,0000063241, 0,0000454. Я использовал BCMath, чтобы получить наиболее точный результат, потому что он связан с расчетом денег, и до сих пор BCMath очень помогал мне в исправлении моей предыдущей ошибки, с которой я столкнулся. Но я обнаружил, что BCMath не может хорошо работать, если экспоненциальное значение, автоматически преобразованное PHP, передается в BCMath. Ниже приведен пример кода:
$x = 0.00002123; // let say I got this value from the other computation;
// this $x value will automatically turn to exponential
// value by php because it have few of leading 0 after the '.'
Шаблон, в котором PHP начинает преобразовывать свое действительное число в экспоненциальное число: (см. изображение ниже)
Как вы можете видеть на изображении выше, шаблон PHP начинает преобразовывать действительное число в экспоненциальное число, когда начальный 0 номер 4 раза -> 0,0000xxxxx (шаблон, где PHP начинает преобразовывать в экспоненциальное).
Затем, допустим, эта переменная $x будет вычислена в одной из функций PHP BCMath:
# First, I work with float number
$calculation1 = bcadd($x,5,12); // adding variable $x to 5
$calculation2 = bcmul($x,4,12); // multiply variable $x to 4
$calculation3 = bcdiv($x,5,12); // divide variable $x to 5
# Second, I tried to work with string number
$y = (string) $x;
$calculation4 = bcadd($y,5,12);
$calculation5 = bcmul($y,4,12);
$calculation6 = bcmul($y,4,12);
Результат оказался ошибкой, вот скриншот для переменной $x:
И здесь результат оказывается ошибкой, вот скриншот для переменной $y (сначала перейдите к строке, потому что BCMath хорошо работает со строкой):
Важное примечание .
- Таким образом, у BCMath возникают проблемы при работе с экспоненциальным значением, я не могу избежать этого экспоненциального значения, потому что PHP автоматически анализирует его до экспоненциального числа, когда оно достигает своего шаблона (см. изображение, которое я прикрепляю выше).
- Учитывая, где переменная $x я получаю из разных вычислений, поэтому в реальном коде я не могу жестко закодировать ее так, как хочу.
bcadd("0.0000000254",4,12);
Проблема здесь заключается в том, что вы ожидаете, что это примет…E-05
в форме строки как число, но это не так. - person CBroe   schedule 18.03.2021