搜尋

首頁  >  問答  >  主體

修復PHP中的貨幣格式問題

<p><code>numfmt_format_currency(new NumberFormatter('en',2), 31.005, "USD")</code> This code outputs $31.00. But it should output $gt; This code outputs $31.00. But it should output $gt; This code outputs $31.00. But it should output $31.01. Howue 3?這段程式碼輸出的是$31.00。但應該輸出$31.01。如何解決這個問題? ? </p><p>PHP在價格格式方面無視將0.005轉換成0.01。 </p><p>我嘗試修復Magento的貨幣格式問題,但在PHP方面找到問題</p><p><br /></p>
P粉322319601P粉322319601551 天前736

全部回覆(1)我來回復

  • P粉275883973

    P粉2758839732023-08-09 10:40:33

    31.005實際上在兩個數字之間,請查看https://php.net/float上的浮點精度。

    > ini_set('precision', 23)
    = "14"
    
    > 31.005
    = 31.00499999999999900524

    (在PHP和其他語言中,沒有31.005這個數字。.)

    #

    你需要提供足夠精確度的數字,但要盡可能少出現誤差,以符合你的顯示要求。這可以透過指定舍入模式來實現,例如,如果你想將31.005四捨五入到31.01,你可以選擇向上舍入或向下舍入。

    #
    $formatter = new NumberFormatter('en', NumberFormatter::CURRENCY);
    
    $formatter->setAttribute(
        NumberFormatter::ROUNDING_MODE, 
        NumberFormatter::ROUND_HALFUP
    );
    
    
    echo $formatter->formatCurrency(31.005, 'USD'), "\n";
    # Output: .01
    

    這就是droopsnoot評論的內容

    數字格式化預設模式和建立

    如Olivier在評論中提醒的那樣,預設模式是半偶數舍入,也稱為銀行家舍入。

    同時,他們指出使用類別常數NumberFormatter::CURRENCY會“更規範”,而不是使用魔術數字2

    $formatter = new NumberFormatter('en', 2);
    $formatter = new NumberFormatter('en', NumberFormatter::CURRENCY);
    

    這將使您的程式碼更好地進行通信,否則數字2可能會被解讀為數字的位數或精度,但在這種情況下並非如此。您可以在PHP手冊中找到所有的樣式常數。

    備註:這不只是PHP特有的問題,當您將這些數字傳遞給Javascript並且需要在Javascript中對它們進行格式化時,您會遇到相同的問題。

    回覆
    0
  • 取消回覆