@kolomat

Почему неправильно умножается?

Добрый вечер, суть проблема такова. Надо разобрать xml файл и пересохранить в yml, который подойдет для загрузки в CMS.
Проблема следующая в исходном файле есть теги currency в которых прописаны курсы.
<currency id="EUR" rate="27.5840"/>
<currency id="RUB" rate="0.3760"/>
<currency id="USD" rate="24.8500"/>

Я записываю значения каждой валюты в отдельную переменную таким образом
$eur = $xmlProducts->currency[0]->attributes()->rate;
$rub = $xmlProducts->currency[1]->attributes()->rate;
$usd = $xmlProducts->currency[2]->attributes()->rate;

Потом при обработке массива с оферами делаю такое сравнение
$price =  $offer->appendChild($xml->createElement('price'));
	if($product->currencyId == 'USD'){
	    $price = $price->appendChild($xml->createTextNode($product->price * $usd));

Но почему то на выходе у меня цена получается на ~ 1-2% меньше чем должно быть. В чем может быть проблема?
P.S распечатка перменной $usd
SimpleXMLElement Object
(
    [0] => 24.8500
)

Распечатка оффера
SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [id] => 382
            [selling_type] => u
        )

    [name] => Дельфины коврик для крышки унитаза
    [categoryId] => 900064
    [price] => 4.43
    [currencyId] => USD
    [image] => Array
        (
            [0] => https://b2b.antey.com.ua/media/product_sku_000382_0.jpg
            [1] => https://b2b.antey.com.ua/media/product_sku_000382_1.jpg
        )

    [vendor] => KERAMAC
    [vendorCode] => SimpleXMLElement Object
        (
        )

    [param] => Array
        (
            [0] => Винил
            [1] => Другие цвета
            [2] => KERAMAC
            [3] => Flori
        )

    [description] => Дельфины коврик для крышки унитаза, винил
    [available] => true
)

Но на выходе
<offer id="382">
        <name>Дельфины коврик для крышки унитаза</name>
        <categoryId>900064</categoryId>
        <price>96</price>
        <description>Дельфины коврик для крышки унитаза, винил</description>
        <vendorCode></vendorCode>
        <vendor>KERAMAC</vendor>
        <param>
          <param name="Материал">Винил</param>
          <param name="Цвет/тип покрытия">Другие цвета</param>
          <param name="Бренд">KERAMAC</param>
          <param name="Серия">Flori</param>
        </param>
      </offer>

Тоесть по логике как я предпологаю должго быть 4,43*24,8500 что равно 110, а по факту как видите получается 96
  • Вопрос задан
  • 128 просмотров
Пригласить эксперта
Ответы на вопрос 1
glaphire
@glaphire Куратор тега PHP
PHP developer
Не хватает точности float, для точный денежных вычислений есть moneyphp/money
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы