Простая математика с десятичными числами в PHP

Это убивает меня! У меня никогда не было столько проблем, и я не могу понять, что я делаю здесь неправильно.

Если у меня есть число, скажем, 2,32, и я хочу заняться математикой, оно не сработает. Самый простой пример:

$income = $commission; //Commission is 2.32, retrieved from XML
echo "income: $income<br>";
$income100 = $income*100;
echo "income100: $income100<br>";

Результат, который я получаю:

income: 2.32
income100: 200

Как я могу точно использовать десятичное число с математикой, не меняя его?

Спасибо!

 wesside29 окт. 2012 г., 21:04
$ доход = (float) $ комиссия; Вероятно, объект SimpleXML
 doniyor29 окт. 2012 г., 21:05
@bigman как тогда$income*100 работай ?
 wesside29 окт. 2012 г., 21:06
Ух ты, я не осознавал, что сделал это струной, чтобы бросить поплавок. Мозг пердеть
 prodigitalson29 окт. 2012 г., 21:05
@bigman: Зачем тебе это делать?string так что, надеюсь, он преобразуется вfloat... просто брось какfloat

Ответы на вопрос(4)

floatval ()

$income = floatval($comission)

оставьте остальной код как есть, и он должен работать как задумано.

как сказал Тим, также обязательно используйтеДо н.э. функции при выполнении арифметической операции над числами с плавающей запятой. конкретноbcmul ():

$income100 = bcmul($income, 100);

Решение Вопроса

Вам необходимо назначить$income следующим образом, чтобы избавиться от основногоSimpleXMLElement:

$income = (float) $commission;

Пример того, что происходит, когда вы этого не делаете:

$x = simplexml_load_string("<a>2.4</a>");
echo $x * 100; // output:  200
 John29 окт. 2012 г., 21:08
Круто, спасибо !!

что вы не можете представлять с ними десятичные числа (если только они не могут быть записаны какa/b для целого числаa а такжеbи даже тогда, только еслиabs(a) < pow(2,52) а такжеb это степень 2).

Вам может быть лучше использовать строковые функции, чтобы получить целочисленное значение:

$tmp = explode(".",$commission);
$tmp = intval($tmp[0].str_pad(substr($tmp[1],0,2),2,"0"));

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

 Niet the Dark Absol29 окт. 2012 г., 21:09
Нет, но я не пытался. Очевидно, что при преобразовании в число что-то идет не так, что приводит к удалению десятичной дроби, но этот ответ решает эту проблему.
 John Dvorak29 окт. 2012 г., 21:08
Точность с плавающей точкой не объясняет2.32=>2

Ваш ответ на вопрос