PHP浮点数精度与货币计算
浮点数精度问题是所有编程语言都有的。0.1加0.2不等于0.3,这个经典问题在PHP里也存在。今天说说PHP中数字处理的正确方式。
浮点数精度问题。
```php
echo "0.1 + 0.2 = " . (0.1 + 0.2) . "\n";
var_dump(0.1 + 0.2 == 0.3);
$sum = 0.1 + 0.2;
$epsilon = 0.0001;
var_dump(abs($sum - 0.3) < $epsilon);
var_dump(round($sum, 2) == 0.3);
?>
BCMath扩展提供高精度计算。
```php
if (!extension_loaded('bcmath')) die("BCMath未安装\n");
$result = bcadd('0.1', '0.2', 2);
echo "0.1 + 0.2 = $result\n";
$a = '123.456';
$b = '78.91';
echo "加法: " . bcadd($a, $b, 4) . "\n";
echo "减法: " . bcsub($a, $b, 4) . "\n";
echo "乘法: " . bcmul($a, $b, 4) . "\n";
echo "除法: " . bcdiv($a, $b, 4) . "\n";
?>
货币计算以分为单位。
```php
class Money
{
private string $amount;
private int $scale;
public function __construct(string $amount, int $scale = 2)
{
$this->amount = $amount;
$this->scale = $scale;
}
public static function fromDecimal(string $amount): self
{
$parts = explode('.', $amount, 2);
$integral = $parts[0];
$fraction = str_pad(substr($parts[1] ?? '00', 0, 2), 2, '0');
return new self($integral . $fraction);
}
public function toDecimal(): string
{
$len = strlen($this->amount);
if ($len <= 2) {
return '0.' . str_pad($this->amount, 2, '0', STR_PAD_LEFT);
}
return substr($this->amount, 0, $len - 2) . '.' . substr($this->amount, $len - 2);
}
public function add(Money $other): self
{
return new self(bcadd($this->amount, $other->amount, 0));
}
public function subtract(Money $other): self
{
return new self(bcsub($this->amount, $other->amount, 0));
}
public function multiply(float $factor): self
{
return new self(bcmul($this->amount, (string)$factor, 0));
}
public function compare(Money $other): int
{
return bccomp($this->amount, $other->amount, 0);
}
public function __toString(): string
{
return $this->toDecimal();
}
}
$price = Money::fromDecimal('99.99');
$quantity = 3;
echo "单价: {$price}\n";
echo "数量: {$quantity}\n";
?>
round、ceil、floor的区别。
```php
$value = 3.14159;
echo "round: " . round($value, 2) . "\n";
echo "ceil: " . ceil($value) . "\n";
echo "floor: " . floor($value) . "\n";
$num = 1234567.89;
echo "格式化: " . number_format($num, 2) . "\n";
echo "法国格式: " . number_format($num, 2, ',', ' ') . "\n";
?>
浮点数比较的注意事项。
```php
// 不要直接比较浮点数
// 用epsilon或round
function floatEquals(float $a, float $b, float $epsilon = 0.0001): bool
{
return abs($a - $b) < $epsilon;
}
?>
PHP的数字处理需要注意浮点数精度、类型转换、大整数范围等问题。货币计算用BCMath扩展或整数分单位。比较浮点数用epsilon或round。掌握了这些,数字处理就不会出问题了。
PHP浮点数精度与货币计算
张小明
前端开发工程师
HS2-HF_Patch:5分钟搞定Honey Select 2汉化去码的终极指南
HS2-HF_Patch:5分钟搞定Honey Select 2汉化去码的终极指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为《Honey Select 2》的日文界面发愁…
laravel的throttle 中间件 的源码解读的庖丁解牛
它的本质是:**Throttle 中间件不是简单的“计数器”,而是一个 基于缓存驱动的状态机。 核心矛盾:如何在不阻塞服务器的前提下,精确限制每个用户(或 IP)在单位时间内的请求次数?解决方案…
ARM Cortex-M4微控制器低功耗设计与高精度模拟外设集成实战
1. 深入解析Kinetis K12微控制器:ARM Cortex-M4内核与低功耗设计在嵌入式开发领域,选对一颗微控制器(MCU)往往是项目成功的一半。尤其是在那些对功耗、成本和实时性都极为敏感的场合,比如需要长时间待机的智能传感器、…
终极PS4游戏修改指南:免费开源的金手指管理器
终极PS4游戏修改指南:免费开源的金手指管理器 【免费下载链接】GoldHEN_Cheat_Manager GoldHEN Cheats Manager 项目地址: https://gitcode.com/gh_mirrors/go/GoldHEN_Cheat_Manager 还在为PS4游戏难度太高而烦恼吗?想要解锁隐藏内容却无从下手&…
如何快速配置插件化音乐播放器:面向初学者的完整指南
如何快速配置插件化音乐播放器:面向初学者的完整指南 【免费下载链接】MusicFree 插件化、定制化、无广告的免费音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/mu/MusicFree MusicFree插件化音乐播放器是一款基于React Native开发的跨平台音乐应…
Pandas 2.0性能优化:Arrow后端与Lazy Evaluation的工程应用
Pandas 2.0性能优化:Arrow后端与Lazy Evaluation的工程应用一、Pandas的性能天花板:内存拷贝与即时执行的代价 Pandas 是 Python 数据分析的事实标准,但在处理百万级以上的数据集时,其性能瓶颈日益凸显。核心问题有两个࿱…