高清国产美女一级毛片_91短视频版在线观看www免费_久久久久久久综合_国产精品爱久久久久久久电影

福州網(wǎng)站建設(shè)>網(wǎng)站新聞>php技術(shù)

踩坑之json_encode精度丟失問題

發(fā)布日期:2022-01-12瀏覽次數(shù):1237 來源:福州網(wǎng)站建設(shè)

1.前言
最近在工作中,后臺出現(xiàn)了這樣的錯誤,傳遞的手續(xù)費是29塊錢,但是傳遞到了第三方接口就報錯了,查看日志顯示該手續(xù)費變成了28.999999999999996,日志如下:






明明是29怎么就變了?通過斷點檢測,原來是json_encode()轉(zhuǎn)換的問題


2.案例演示
$param={


‘a(chǎn)mount’=>5000,


‘fee’=>29


}


var_dump(json_encode($param));//{"amount":5000,"fee":28.999999999999999999996}
3.解決方法
3.1方法1:強(qiáng)行轉(zhuǎn)換成字符串保證精度
$request['param']['feeAmount']=(string)$request['param']['feeAmount'];


注意:使用這種方法千萬要注意,對接接口是否有變量類型要求


3.2方法2:格式化數(shù)字number_format函數(shù)
number_format(number,decimals,decimalpoint,separator)


參數(shù):


number參數(shù)是要格式化的數(shù)據(jù)
decimals參數(shù)是保留的小數(shù)
decimalpoint參數(shù)是規(guī)定用作小數(shù)點的字符串
separator參數(shù)是規(guī)定用作千位分隔符的字符串
案例:
$request['param']['feeAmount']=(int)number_format($request['param']['feeAmount'],0);


注意:number_format返回的是字符串string,要注意接口是否有規(guī)范要求,如果有,則須強(qiáng)行轉(zhuǎn)換為int或接口規(guī)范的類型


疑問1:這時候應(yīng)該有人在想能不能直接強(qiáng)制轉(zhuǎn)換為int呢?注意,float強(qiáng)制轉(zhuǎn)換成int有坑!


答:int類型是向下取整的,比如:12910.9 會被轉(zhuǎn)換為 12910


疑問2:這時就會有人問我,浮點數(shù)顯示的是8,為什么轉(zhuǎn)換成整數(shù)會變成7?


答:floor((0.1+0.7)*10),其結(jié)果是7而不是8,是因為該結(jié)果內(nèi)部表示的是7.9999.....所以不要相信浮點數(shù)結(jié)果精確,也不要比較兩個浮點數(shù)是否相等
3.3方法3:修改配置項serialize_precision
json_encode() 轉(zhuǎn)換浮點小數(shù)溢出現(xiàn)象只出現(xiàn)在PHP 7.1+版本,是因為php源碼對于json_encode()轉(zhuǎn)換使用到了serialize_precision配置項,如下圖


static inline void php_json_encode_double(smart_str *buf, double d, int options) /* {{{ */
{
    size_t len;
    char num[PHP_DOUBLE_MAX_LENGTH];
    php_gcvt(d, (int)PG(serialize_precision), '.', 'e', num);
    len = strlen(num);
    if (options & PHP_JSON_PRESERVE_ZERO_FRACTION && strchr(num, '.') == NULL && len < PHP_DOUBLE_MAX_LENGTH - 2) {
        num[len++] = '.';
        num[len++] = '0';
        num[len] = '\0';
    }
    smart_str_appendl(buf, num, len);
}
關(guān)于PHP函數(shù)serialize_precision (integer)的一些概念了解:


適用范圍:PHP_INI_ALL;


默認(rèn)值:100


serialize_precision指令的數(shù)量決定了雙打和彩車被序列化后的浮點數(shù)字存儲。設(shè)置到一個合適的值,確保精度的數(shù)字時,可能丟失以后反序列化。所以我們要使得json_encode()轉(zhuǎn)換浮點數(shù)沒有小數(shù)溢出,建議使用默認(rèn)值 serialize_precision = -1 即可 。


3.4知識點補充
json_encode有個選項JSON_PRESERVE_ZERO_FRACTION,表示如果是個整數(shù), 是否保留小數(shù)點和尾數(shù)0,舉例如下:


<?php
echo json_encode(223.0);// 223
echo json_encode(223.0, JSON_PRESERVE_ZERO_FRACTION);// 223.0
3.5其他取整函數(shù)
四舍五入取整 round(param)
向上取整 ceil(param)
向下取整 floor(param)


4.bcsub()函數(shù)精度相減
格式:


string bcsub ( string $left_operand , string $right_operand [, int $scale = int ] )


說明:


2個任意精度數(shù)字的減法


參數(shù):


left_operand:字符串類型的左操作數(shù).


right_operand:字符串類型的右操作數(shù).


scale:此可選參數(shù)用于設(shè)置結(jié)果中小數(shù)點后的小數(shù)位數(shù)。也可通過使用 bcscale() 來設(shè)置全局默認(rèn)的小數(shù)位數(shù),用于所有函數(shù)。


返回值:


返回減法之后結(jié)果為字符串類型.


代碼案例:


<?php
$a  =  '1.234' ;
$b  =  '5' ;
echo  bcsub ( $a ,  $b );      // -3
echo  bcsub ( $a ,  $b ,  4 );   // -3.7660
————————————————
版權(quán)聲明:本文為CSDN博主「拯救世界的派大星」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/m0_46266407/article/details/105556444

以上是由福州網(wǎng)站建設(shè)的小編為你分享了"踩坑之json_encode精度丟失問題"文章,如果你在這方面有什么問題,隨時聯(lián)系我們

php技術(shù)有關(guān)的文章
如果您有什么問題,歡迎咨詢我們客服! 點擊QQ咨詢
高清国产美女一级毛片_91短视频版在线观看www免费_久久久久久久综合_国产精品爱久久久久久久电影

        久久亚洲欧洲| 在线一区视频观看| 91午夜精品| 国产一在线精品一区在线观看 | 自拍日韩欧美| 久久一区亚洲| 日韩中文字幕不卡| 久久精品免费一区二区三区| 国产精品三级| 亚洲乱码一区| 九九久久婷婷| 欧美日韩亚洲国产精品| 女人天堂亚洲aⅴ在线观看| 麻豆精品在线播放| 久久精品xxxxx| 日韩手机在线| 日韩一区精品字幕| 国产日韩专区| 伊人影院久久| 亚洲特级毛片| 久久高清免费| 日韩黄色大片| 久久婷婷一区| 久久婷婷av| 久久国产欧美| 999精品色在线播放| 热三久草你在线| 精品视频在线观看网站| 久久国产婷婷国产香蕉| 日韩二区在线观看| 国产伦乱精品| 欧美精品不卡| 荡女精品导航| 午夜精品久久久久久久久久蜜桃| 韩国久久久久久| 香蕉成人av| 精品一区免费| 亚洲一区二区日韩| 亚洲欧美网站在线观看| 国产精品一卡| 欧美日韩精品免费观看视欧美高清免费大片 | 999视频精品| 国产一区日韩一区| 免费精品视频| 日韩激情中文字幕| 国产一区二区三区精品在线观看| 国产精品99久久精品| 免费在线小视频| 99riav1国产精品视频| 亚洲小说春色综合另类电影| 日韩国产欧美在线视频| 大香伊人久久精品一区二区| 色婷婷精品视频| 视频国产精品| 蜜桃av在线播放| 亚洲欧美日韩国产一区二区| 在线国产精品一区| 精品女同一区二区三区在线观看| 91精品国产调教在线观看| 中文久久精品| 色一区二区三区四区| 久久国产免费| 国产伦精品一区二区三区在线播放| 福利一区二区| 婷婷五月色综合香五月| 成人精品国产亚洲| 美女尤物久久精品| 91亚洲国产| 日本国产一区| 91精品xxx在线观看| 日韩不卡一区二区| 欧美亚洲在线日韩| 国产一区二区三区国产精品| 日韩一区精品视频| 久久国产中文字幕| 欧美91在线|欧美| 中文久久精品| 欧美午夜精彩| 国产69精品久久| 色婷婷成人网| 午夜在线精品| 天堂√8在线中文| 欧美精品导航| 欧美一级二级视频| 怡红院精品视频在线观看极品| 精品国产欧美| 久久国产三级| 日韩精品一区二区三区中文在线| 欧美精品一二| 国产 日韩 欧美一区| 麻豆精品久久久| 久久精品av麻豆的观看方式| 最新亚洲激情| 久久久久午夜电影| 久久婷婷久久| 成人自拍av| jizzjizz中国精品麻豆| 国产欧美日韩一级| 欧美影院精品| 亚洲婷婷丁香| 综合国产视频| 免费观看在线综合| 久久午夜影视| 日韩在线电影| 日韩精品一页| 国产亚洲观看| 国产精品久久久久久久久久久久久久久| 日韩精品免费视频一区二区三区 | 日本aⅴ亚洲精品中文乱码 | 日本а中文在线天堂| 97精品97| 日本少妇一区| 日韩在线不卡| 影视先锋久久| 久久成人国产| 日本在线视频一区二区| 日韩精品一级| 国产成人精品999在线观看| 给我免费播放日韩视频| 香蕉人人精品| 日韩在线一二三区| 日本99精品| 日韩在线不卡| 一区二区精品| 福利一区二区| 女人天堂亚洲aⅴ在线观看| 免费欧美日韩| 国产精品免费精品自在线观看| 精品视频91| 婷婷丁香综合| 日韩高清不卡在线| 亚洲深夜视频| 亚洲综合精品| 欧美激情视频一区二区三区在线播放| 国产 日韩 欧美 综合 一区| 电影天堂国产精品| 天堂av一区| 成人国产精选| 亚洲欧美网站| 国产精品久久久久久久久久10秀 | 久久影院资源站| 最新亚洲一区| 精品一区二区三区的国产在线观看 | 免费av一区二区三区四区| 日韩中文字幕一区二区三区| 日韩av不卡在线观看| 色一区二区三区四区| 亚洲女同一区| 麻豆一区二区99久久久久| 国产中文一区| 久久国产麻豆精品| 亚洲午夜久久久久久尤物| 亚洲午夜久久| 久久婷婷激情| 久久一区亚洲| 六月婷婷一区| 亚洲涩涩在线| 国产精品多人| 日韩亚洲精品在线观看| 亚洲成人精品| 国产不卡人人| 美日韩一区二区三区| 免费看日韩精品| 91精品国产福利在线观看麻豆| 美女视频免费精品| 日本精品一区二区三区在线观看视频 | 日韩在线a电影| 蜜臀久久99精品久久一区二区| 国产精品免费99久久久| 蜜桃av一区二区在线观看| 三级在线看中文字幕完整版| 欧美日一区二区在线观看| 丝袜美腿成人在线| 美女毛片一区二区三区四区| 成午夜精品一区二区三区软件| 亚洲精品人人| 免费在线观看日韩欧美| 国产亚洲毛片在线| 欧美一区二区三区高清视频| 久久久久久婷| 91麻豆国产自产在线观看亚洲| 麻豆国产精品一区二区三区| 久久久国产精品网站| 欧美精品导航| 国产不卡精品| 久久男人av资源站| 日韩免费高清| 偷拍精品精品一区二区三区| 91精品韩国| 免费视频亚洲| 老牛国产精品一区的观看方式| 妖精视频成人观看www| 免费视频最近日韩| 在线精品观看| 四虎国产精品免费久久| 综合欧美亚洲| 美女视频黄免费的久久| 新版的欧美在线视频| 亚洲福利精品| 日韩中文字幕无砖|