使用bc一類的函數(shù),按字符串方式運(yùn)算即可。
我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、十堰ssl等。為1000+企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的十堰網(wǎng)站制作公司
/**
*?數(shù)值非四舍五入保留兩位小數(shù)
*?@author?Zjmainstay
*?@website?
*?@param?$num?數(shù)值
*?@return?保留兩位小數(shù)
*/
function?getNum($num,?$scale?=?2)?{
$numStr?=?(string)$num?.?str_repeat('0',?$scale);
//匹配精度前的數(shù)值
if(preg_match('#^\d+\.\d{0,'.$scale.'}#',?$numStr,?$match))?{
return?$match[0];
}?else?{
return?'0';
}
}
echo?getNum(10.0253)?.?"\n";
echo?getNum(0.5)?.?"\n";
要分2種情況。
1、數(shù)值不變,只在輸出時(shí)保留2位小數(shù)。
echo sprintf('%.2f', 3.1415);
2、數(shù)值上保留2位
echo round(3.1415, 2);
php向下保留兩位小數(shù)有以下幾個(gè)辦法
同樣,sprintf的操作也是一樣的效果,會(huì)自動(dòng)四舍五入的。
結(jié)局也是一樣的。
再看我們的需求,傳統(tǒng)的方法都不能達(dá)到目的。當(dāng)然非傳統(tǒng)的方法也有幾種。
這種方法原理上也沒問題,思路也正確,也能得出正確的答案。似乎能解決我們的問題。
看看下面的計(jì)算:
咦~。怎么回事,這么簡(jiǎn)單的,都計(jì)算錯(cuò)了。
這里如果還在懵逼的同學(xué)們,可能你需要去補(bǔ)下精度的知識(shí)了。這里不做講解。知道這樣的計(jì)算有可能會(huì)算錯(cuò)的,就行啦。
使用高精度的計(jì)算方法,保證結(jié)果正確,計(jì)算不出錯(cuò)。但是這個(gè)函數(shù)對(duì)環(huán)境有依賴的,不是隨便的php環(huán)境都支持的。我們公司的本地環(huán)境支持,線上環(huán)境不支持的。所以后來就又找了其他的方法。
這種方法比較單一,不適用計(jì)算,也不用擔(dān)心計(jì)算出錯(cuò)。無論小數(shù)點(diǎn)后是否有數(shù)字,都可以精確舍去。
這種方法,也能到自己的想要的結(jié)果
可能你會(huì)疑問,為啥是四位,三位不就行了。你要知道,number_format會(huì)四舍五入的。如果第三位是9的話,會(huì)進(jìn)1的。
舉個(gè)例子:
其實(shí)第5中方法是不行的,不信,你試試1.99999999999999999,這樣的數(shù)字向下保留個(gè)試試,牽扯到四舍五入的操作,會(huì)有誤差的。
ok,這是目前能想到的所有向下保留兩位小數(shù)的操作。
今天處理數(shù)據(jù)的時(shí)候因?yàn)橐A?位小數(shù),查看幫助手冊(cè)
?php
$number?=?1234.56;
//?english?notation?(default)
$english_format_number?=?number_format($number);
//?1,235
//?French?notation
$nombre_format_francais?=?number_format($number,?2,?',',?'?');
//?1?234,56
$number?=?1234.5678;
//?english?notation?without?thousands?seperator
$english_format_number?=?number_format($number,?2,?'.',?'');
//?1234.57
?
PHP 中的 round() 函數(shù)可以實(shí)現(xiàn)
round() 函數(shù)對(duì)浮點(diǎn)數(shù)進(jìn)行四舍五入。
round(x,prec)
參數(shù)說明
x 可選。規(guī)定要舍入的數(shù)字。
prec 可選。規(guī)定小數(shù)點(diǎn)后的位數(shù)。
返回將 x 根據(jù)指定精度 prec (十進(jìn)制小數(shù)點(diǎn)后數(shù)字的數(shù)目)進(jìn)行四舍五入的結(jié)果。prec 也可以是負(fù)數(shù)或零(默認(rèn)值)。
注釋:PHP 默認(rèn)不能正確處理類似 "12,300.2" 的字符串。
例如:
?php
echo round(-4.635,2);
?
輸出: -4.64
兩種取值法,看你需要什么結(jié)果:
1 四舍五入(簡(jiǎn)單,自帶函數(shù)就可以解決)
$youWantNum?=?sprintf('%.2f',?$num);
//有人說用floor,floor是取整的函數(shù),無法直接取小數(shù);但可以轉(zhuǎn)換得到結(jié)果,那就是下面的例子
2 舍去后面的,不管是什么
/*
*$num?要處理的浮點(diǎn)數(shù)
*$digits?保留的小數(shù)位數(shù)
*?實(shí)現(xiàn)思路:先乘以10的小數(shù)位數(shù)次方,用floor向下取整,再除以除數(shù)得到舍去后面位數(shù)的結(jié)果
*?最后再用sprintf配合位數(shù)再取一次值(此處是為了解決有些數(shù)字,最后一位為零時(shí)不顯示問題)
*/
function?floorFloat($num,?$digits)?{
$num?=?floatval($num);
$multiple?=?pow(10,?$digits);
$tempNum?=?floor($num*$multiple);
return?sprintf('%.'.$digits.'f',?$tempNum/$multiple);
}
新聞標(biāo)題:php保留二位小數(shù)據(jù) php 保留3位小數(shù)
網(wǎng)站路徑:http://muchs.cn/article20/hgepjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)公司、服務(wù)器托管、關(guān)鍵詞優(yōu)化、電子商務(wù)、App開發(fā)、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)