news 2026/6/13 2:01:25

PHP浮点数精度与货币计算

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP浮点数精度与货币计算

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。掌握了这些,数字处理就不会出问题了。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 15:13:34

HS2-HF_Patch:5分钟搞定Honey Select 2汉化去码的终极指南

HS2-HF_Patch&#xff1a;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》的日文界面发愁…

作者头像 李华
网站建设 2026/6/9 15:09:00

laravel的throttle 中间件 的源码解读的庖丁解牛

它的本质是&#xff1a;**Throttle 中间件不是简单的“计数器”&#xff0c;而是一个 基于缓存驱动的状态机。 核心矛盾&#xff1a;如何在不阻塞服务器的前提下&#xff0c;精确限制每个用户&#xff08;或 IP&#xff09;在单位时间内的请求次数&#xff1f;解决方案&#xf…

作者头像 李华
网站建设 2026/6/9 15:07:54

ARM Cortex-M4微控制器低功耗设计与高精度模拟外设集成实战

1. 深入解析Kinetis K12微控制器&#xff1a;ARM Cortex-M4内核与低功耗设计在嵌入式开发领域&#xff0c;选对一颗微控制器&#xff08;MCU&#xff09;往往是项目成功的一半。尤其是在那些对功耗、成本和实时性都极为敏感的场合&#xff0c;比如需要长时间待机的智能传感器、…

作者头像 李华
网站建设 2026/6/9 15:06:54

终极PS4游戏修改指南:免费开源的金手指管理器

终极PS4游戏修改指南&#xff1a;免费开源的金手指管理器 【免费下载链接】GoldHEN_Cheat_Manager GoldHEN Cheats Manager 项目地址: https://gitcode.com/gh_mirrors/go/GoldHEN_Cheat_Manager 还在为PS4游戏难度太高而烦恼吗&#xff1f;想要解锁隐藏内容却无从下手&…

作者头像 李华
网站建设 2026/6/9 15:03:54

如何快速配置插件化音乐播放器:面向初学者的完整指南

如何快速配置插件化音乐播放器&#xff1a;面向初学者的完整指南 【免费下载链接】MusicFree 插件化、定制化、无广告的免费音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/mu/MusicFree MusicFree插件化音乐播放器是一款基于React Native开发的跨平台音乐应…

作者头像 李华
网站建设 2026/6/9 15:02:54

Pandas 2.0性能优化:Arrow后端与Lazy Evaluation的工程应用

Pandas 2.0性能优化&#xff1a;Arrow后端与Lazy Evaluation的工程应用一、Pandas的性能天花板&#xff1a;内存拷贝与即时执行的代价 Pandas 是 Python 数据分析的事实标准&#xff0c;但在处理百万级以上的数据集时&#xff0c;其性能瓶颈日益凸显。核心问题有两个&#xff1…

作者头像 李华