Magento – Magento 2 – Rounding Float Values to Currency Precision

currencymagento2price

Currently I have stored values based on percentages of order subtotals out to a precision of 4 decimal places in the database. I need to show a balance as a total sum of those percentages. I have an account with two calculated percentage totals, both equaling 2.8430. So to create a display price I add them up 2.8430 + 2.8430 = 5.6860 and send that value to the toCurrency() function of the \Magento\Framework\Locale\CurrencyInterface class.

<?php

/*
* @var $store \Magento\Store\Model\StoreManagerInterface
* @var $currency \Magento\Framework\Locale\CurrencyInterface
*/
$store = $this->storeManager->getStore();
$currency = $this->currency->getCurrency($store->getBaseCurrencyCode());
$value = $currency->toCurrency(sprintf("%f", $value), $options);

However, that's displaying $5.69 when it should be displaying $5.68 in currencies with a precision of 2. I can't find a method in the currency class that will round numbers based on currency precision and I need to do that in order to display the price correctly as well as run some conditional checks on the values to make sure customer requests for withdrawals aren't greater than the sum (5.68).

I've resorted to sending the values to the toCurrency() function, removing the symbol, and running the string result through floatval(), but I feel like this is a hack and I'm wondering if there's a more appropriate way?

$currencyPrecision = $currentAccount->convertToPrice($value, ['display' => \Zend_Currency::NO_SYMBOL]);
$availableAmount = floatval($currencyPrecision);

Best Answer

I found Magento\Directory\Model\Currency, which I think will work.

Related Topic