知识分类
后端
前端
设计
开源组件/产品
APP
其他
广告招募

PHP 中并不是把MYSQL字段设置成decimal就万无一失

管理员
发布于:2023-07-24 22:29:00

MYSQL的decimal是一种精准数据类型,一般用于存放货币类型。但是如果你再PHP中没有进行正确的处理,还是会出现精度问题,出错示例如下:

echo floor((0.1 + 0.7) * 10);

上面的代码返回的是“7”,和想象中不一样,如果把这个数据存到MYSQL,即使字段设置的是decimal,最后实际上也是会出现误差,为什么会出现这个问题,这里不详细解释,大家可以自行百度。

下面重点解释如何解决这个误差问题:

方案一:

安装PHP的decimal扩展,需要PHP版本 >7.2

安装方法和手册请查看:

http://php-decimal.io/#basic-usage

简单使用方法:

use Decimal\Decimal;

$a = new Decimal("1", 2);
$b = new Decimal("7", 8);

print_r($a / $b);

方案二:

使用PHP内置函数:

  bcadd — 将两个高精度数字相加

  bccomp — 比较两个高精度数字,返回-1, 0, 1

  bcdiv — 将两个高精度数字相除

  bcmod — 求高精度数字余数

  bcmul — 将两个高精度数字相乘

  bcpow — 求高精度数字乘方

  bcpowmod — 求高精度数字乘方求模,数论里非常常用

  bcscale — 配置默认小数点位数,相当于就是Linux bc中的”scale=”

  bcsqrt — 求高精度数字平方根

  bcsub — 将两个高精度数字相减

简单使用方法:

floor(bcadd($a, $b, 2) * 10) //可以看出成功返回想要的数字8

使用那种方法,看自己的是实际情况来决定。

上一篇:php常用实用函数(不定期更新)
下一篇:php json_encode有双引号,前端JS解码报错的解决方法
搜索内容
最新文章
  • 什么是GEO生成式引擎优化?和SEO
  • 如何保证文件上传安全?
  • Go语言时间格式为什么和其他语言不一
  • 软件许可协议有哪些?之间的区别是什么
  • FrameCoder非可站群框架支持
  • git忽略文件.gitignore,
  • 什么AI模型上下文协议(MCP)?M
  • 为什么有些页面的图片看不见?可能是被
  • 什么是AI智能体?AI智能体能做什么
  • 国内AI大模型有哪些?各模型间对比如
精彩文章
  • 1 MSYS2中安装使用GCC的正确方法
  • 2 Layui 怎么样更换主题颜色?
  • 3 vscode用一个插件快速生成Vue
  • 4 连接WIFI出现无Internet
  • 5 FrameCoder非可,基于web
  • 6 3步教你如何修改uniapp but
  • 7 JavaScript 判断对象是否为
  • 8 OBS在银河麒麟或ubuntu等核心
  • 9 什么是PHP站群以及使用php开源框
  • 10 小程序真机调试 报错 define
工信部备案:苏ICP备2023011827号-1
苏公网安备 32111202000338号