注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

PHP如何显示(输出)两位小数、PHP格式化小数 关于价格的计算  

2013-09-27 16:25:20|  分类: Web技术-Php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
PHP如何显示(输出)两位小数、PHP格式化小数 关于价格的计算

在很多时候,我们都需要格式化一些数据,比如价格等。那么如何来格式化显示这些数据呐?

一 round()函数 方式:
说明:
float round ( float $val [, int $precision ] )

返回将 val 根据指定精度 precision (十进制小数点后数字的数目)进行四舍五入的结果。precision 也可以是负数或零(默认值)。

eg

echo round(3.6);//4
echo round(3.6,0);//4
echo round(1.95583,?2);//1.96

$a = 12345678;
echo round($a,-3);//12346000


二 ceil()函数 方式(大于等于):

 说明:

 float ceil ( float $value )

 返回不小于 value 的下一个整数,value 如果有小数部分则进一位

eg

<?php
$int = 2.5638;
$num = '2.5638';

echo '<br/>'.ceil($int);//3
echo '<br/>'.ceil($num); //3


三 floor()函数方式(小于等于):

  说明:

   float floor ( float $value )

  返回不大于 value 的最接近的整数,舍去小数部分取整。

  eg

<?php
$int = 2.5638;
$num = '2.5638';

echo '<br/>'.floor($int);//2
echo '<br/>'.floor($num);//2


四  number_format()函数方式:
说明:
string number_format ( float $number , int $decimals = 0 , string $dec_point = '.' , string $thousands_sep = ',' )
以千分位的方式格式化数据。
eg

<?php
$int = 1234.5678;
$num = '1234.5678';

//不保留小数
echo '<br/>'.number_format($int);//1,235

//保留2位小数
echo '<br/>'.number_format($int,2);//1,234.57

//保留3位小数,小数点分隔符为'.',千分位分隔符为','
echo '<br/>'.number_format($int,3,'.',',');//1,234.568

//保留3位小数,小数点分隔符为'.',千分位分隔符为','
echo '<br/>'.number_format($num,3,'.',',');//1,234.568

补0情况:

<?php
$int = 1234.5;
$num = '1234.5';

//不保留小数
echo '<br/>'.number_format($int);//1,235

//保留2位小数
echo '<br/>'.number_format($int,2);//1,234.50

//保留3位小数,小数点分隔符为'.',且不使用千分位分隔符
echo '<br/>'.number_format($int,3,'.','');//1234.500

//保留3位小数,小数点分隔符为'.',且不使用千分位分隔符'

echo '<br/>'.number_format($num,3,'.','');//1234.500



五 sprintf()[或者printf()函数]函数

此函数源于c 中强的printf()函数。所以是一个强大的格式化工具。
说明:
string sprintf ( string $format [, mixed $args [, mixed $... ]] )

format包含:

其格式(format)有如下值:
d 有符号10进制整数
i 有符号10进制整数
o 无符号8进制整数
u 无符号10进制整数
x 无符号的16进制数字,并以小写abcdef表示
X 无符号的16进制数字,并以大写ABCDEF表示
F/f 浮点数
E/e 用科学表示格式的浮点数
g 使用%f和%e表示中的总的位数表示最短的来表示浮点数 G 同g格式,但表示为指数
c 单个字符
s 字符串
% 显示百分号本身 

格式说明:

%[标志][输出最小宽度][. 精度][长度]转换说明符。方括号里是可选项.

例子1:(%d)

$a = 12;
printf("%03d",$a);// 012(如果这里是printf("%3d",$a),那么输出也是三位,只是在前补的是空格)

以上表示:我要输出三位的整数,但$a只有两位,
那么将在前以补0方式,直到三位。

例子2:(%s)

$a = 'i love';
printf("%10s",$a);

以上表示我要输出10位字符,但是$a只有6位,那么将会在前面补上4位空格

%s的 m.ns形式:m指最小宽度,而n,指显示字符串的时候,显示前n个字符.

$a = 'i love';
printf("%10.3s",$a);//将输出 'i l'

我仍然输出10位字符,只不过我只要字符中的前三位字符.


例子3: (%f)

%f的 %m.nf 形式:m指整个实数,包括整数、小数点和小数共占m个字符的宽度,如果不够宽度,将在左边补空格。而n,指实数输出的时候,显示n位小数.

$a = '12.3';
printf("%10.3f",$a);//将输出? 12.300

整个实数以10位输出,但保留三位小数

以上我只是简单写了些,其实还很多的格式。(只不过,这些我认为常用)

六 intval 函数问题

<?php
var_dump ( intval ( 0.48 * 100 ) ); //output int 48
var_dump(intval(0.58 * 100)); //output int 57
var_dump(intval(0.68 * 100)); //output int 68

为何 0.58整形后变成了 57?

这里的关键点就在于, 小数在二进制的表示, 关于小数如何用二进制表示, 大家可以百度一下, 我这里就不再赘述, 我们关键的要了解, 0.58 对于二进制表示来说, 是无限长的值(下面的数字省掉了隐含的1)..

0.58的二进制表示基本上(52位)是: 0010100011110101110000101000111101011100001010001111
0.57的二进制表示基本上(52位)是: 0010001111010111000010100011110101110000101000111101

而两者的二进制, 如果只是通过这52位计算的话,分别是

0.58 -> 0.57999999999999996
0.57 -> 0.56999999999999995:

至于0.58 * 100的具体浮点数乘法, 我们不考虑那么细, 有兴趣的可以看(Floating point), 我们就模糊的以心算来看… 0.58 * 100 = 57.999999999

那你intval一下, 自然就是57了….

参考:http://www.laruence.com/2013/03/26/2884.html


附:

1  PHP内置了一个money 格式化的函数: money_format

2  关于sscanf 函数的作用: http://cn2.php.net/manual/zh/function.sscanf.php

3  sprintf()函数不会主动输出,详细见手册


  评论这张
 
阅读(4038)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017