php将科学计数法转数字的实现方法:首先通过if语句判断指定的数值是否为科学计数法;然后提取科学计数法中有效的数据;接着正式处理该数据;最后调用“convert_scientific_number_to_normal”方法实现转换即可。

PHP将科学计数法转换为正常的数字

每天,都会遇到些稀奇古怪的BUG,然后有遇到一个数字变成科学计数法的问题。问题来源于当前输出的一个数字太大了,然后存不下了。比如echo 14735037137891444444;

echo 0.00000000000000000000000000001;

然后输出的结果为:1.4735037137891E+19

1.0E-29

这种情况也算常见了,只是数字太大或太小导致的,然后数据库的存储字段直接是字符串,结果就出现了种种神奇的问题。

然后就在网上找了个同样神奇的函数,确实有效,但也满坑的。然后就自己写了个,逻辑有点复杂,但没涉及到数字运算,精度应该是有保证的。<?php

/**

* 将科学计数法的数字转换为正常的数字

* 为了将数字处理完美一些,使用部分正则是可以接受的

* @author loveyu

* @param string $number

* @return string

*/

function convert_scientific_number_to_normal($number)

{

if(stripos($number, 'e') === false) {

//判断是否为科学计数法

return $number;

}

if(!preg_match(

"/^([\\d.]+)[eE]([\\d\\-\\+]+)$/",

str_replace(array(" ", ","), "", trim($number)), $matches)

) {

//提取科学计数法中有效的数据,无法处理则直接返回

return $number;

}

//对数字前后的0和点进行处理,防止数据干扰,实际上正确的科学计数法没有这个问题

$data = preg_replace(array("/^[0]+/"), "", rtrim($matches[1], "0."));

$length = (int)$matches[2];

if($data[0] == ".") {

//由于最前面的0可能被替换掉了,这里是小数要将0补齐

$data = "0{$data}";

}

//这里有一种特殊可能,无需处理

if($length == 0) {

return $data;

}

//记住当前小数点的位置,用于判断左右移动

$dot_position = strpos($data, ".");

if($dot_position === false) {

$dot_position = strlen($data);

}

//正式数据处理中,是不需要点号的,最后输出时会添加上去

$data = str_replace(".", "", $data);

if($length > 0) {

//如果科学计数长度大于0

//获取要添加0的个数,并在数据后面补充

$repeat_length = $length - (strlen($data) - $dot_position);

if($repeat_length > 0) {

$data .= str_repeat('0', $repeat_length);

}

//小数点向后移n位

$dot_position += $length;

$data = ltrim(substr($data, 0, $dot_position), "0").".".substr($data, $dot_position);

} elseif($length < 0) {

//当前是一个负数

//获取要重复的0的个数

$repeat_length = abs($length) - $dot_position;

if($repeat_length > 0) {

//这里的值可能是小于0的数,由于小数点过长

$data = str_repeat('0', $repeat_length).$data;

}

$dot_position += $length;//此处length为负数,直接操作

if($dot_position < 1) {

//补充数据处理,如果当前位置小于0则表示无需处理,直接补小数点即可

$data = ".{$data}";

} else {

$data = substr($data, 0, $dot_position).".".substr($data, $dot_position);

}

}

if($data[0] == ".") {

//数据补0

$data = "0{$data}";

}

return trim($data, ".");

}

简单的测试数据1.12E8 ------------- 112000000

1.12E3 ------------- 1120

1.12E2 ------------- 112

1.12E0 ------------- 1.12

1.12E-1 ------------ 0.112

1.12E-2 ------------ 0.0112

1.12E-8 ------------ 0.0000000112

0.112E1 ------------ 1.12

0.112E2 ------------ 11.2

0.112E4 ------------ 1120

0.112E-2 ----------- 0.00112

0000.112E-2 -------- 0.00112

0000.112000E-2 ----- 0.00112

.112E-2 ------------ 0.00112

.112E2 ------------- 11.2

php科学计数法转string,php如何将科学计数法转数字相关推荐

  1. leetcode 567. Permutation in String 字符串的排列 滑动窗口法

    题目 给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列.换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1:输入: s1 = "ab" s ...

  2. C++counting sort计数排序(针对string)的实现算法(附完整源码)

    C++counting sort计数排序的实现算法 C++counting sort计数排序的实现算法完整源码(定义,实现,main函数测试) C++counting sort计数排序的实现算法完整源 ...

  3. 74160ENT引脚设计法+同步置数法接成365进制加法计数电路

    之前已完成了使用ENT引脚设计法接成1000进制加法计数电路这一任务, 现在只需将设计好的1000进制加法计数电路稍加修改, 便可构成365进制加法计数电路. 题目: 将用ENT引脚设计法接成的100 ...

  4. 雨流计数法python程序_rain flow 雨流计数法

    雨流计数法又可称为"塔顶法",是由英国的Matsuiski和Endo 两位工程师提出的, 距今已有50 多年.雨流计数法主要用于工程界, 特别在疲劳寿命计算中运用非常广泛.把应变- ...

  5. matlab层次分析法代码_基于主成分分析法和层次分析法的工程项目经理胜任力评价研究...

    摘 要:根据工程项目经理胜任力评价指标,运用主成分分析法和层次分析法相结合的数学方法对工程项目经理的胜任力进行合理公正的评价.首先运用主成分分析法筛选重要指标,再运用层次分析法对工程项目经理进行定量与 ...

  6. 微电子科学与工程要学计算机吗,微电子科学与工程专业适合女生学习吗

    微电子科学与工程专业适合女生学习吗2020-11-28 13:49:30文/钟诗贺 微电子科学与工程专业是典型的工科专业,那么这个专业适不适合女生学习呢?下面小编为大家详细盘点一下相关信息,供大家参考 ...

  7. ML之DataScience:基于机器学习处理数据科学(DataScience)任务(数据分析、特征工程、科学预测等)的简介、流程、案例应用执行详细攻略

    ML之DataScience:基于机器学习处理数据科学(DataScience)任务(数据分析.特征工程.科学预测等)的简介.流程.案例应用执行详细攻略 目录 数据科学的任务(数据分析.特征工程.科学 ...

  8. Java反梯形图案_梯形法求定积分(一)设计梯形法求积分的类模板,梯形法

    /*设计梯形法求积分的类模板,梯形法求积分的函数被定义为成员函数,可以求任意函数的定积分,用积分类的模板参数T引入被积函数*/ #include #include #include using nam ...

  9. 开放科学背景下的科学数据开放共享:国家青藏高原科学数据中心的实践

    开放科学背景下的科学数据开放共享:国家青藏高原科学数据中心的实践 潘小多1,2, 李新1,2, 冉有华3, 郭学军2 1 中国科学院青藏高原研究所国家青藏高原科学数据中心,北京 100101 2 中国 ...

最新文章

  1. 在Centos中安装aria2c
  2. service mysqld start,Failed to start mysqld.service: Access denied
  3. centos重置系统_双系统下Linux系统无法启动及其引导丢失之解决
  4. python具体应用过程_python公开课|Python for循环的具体应用就是python流程控制的核心,想学会就来看看...
  5. 实录:有钱男性的真实私生活
  6. 浏览器调试动态js脚本
  7. 偶然接触oracle中的变量
  8. 抖音微博火山快手皮皮虾微视去水印附源码
  9. 12306春运火车票抢票攻略——3分钟抢到热门票
  10. iOS开发:苹果开发者账号第一次新建APP ID以及创建App的步骤
  11. メリッサ / 梅莉莎
  12. 数据库应用——MySQL集群
  13. DM368开发 -- 你需要了解的知识点
  14. 讲讲Python爬虫绕过登录的小技巧
  15. UIToolBar实现高斯模糊
  16. Redis中RDB操作
  17. 能够证明“3=0”吗?
  18. matlab习题及答案,MATLAB习题及答案
  19. 开源的 智能卡 COS系统源码
  20. ATN 抵御合约攻击的报告——基于ERC223与DS-AUTH的混合漏洞

热门文章

  1. Hibernate访问数据库,HibernateTemplate操作数据库,实现增删改查
  2. 微信开发基础 获取用户OpenID 列表
  3. flutter网络权限申请
  4. Ant Design Pro 登录超时处理
  5. 利用ado.net和winform连接ms Server可以做什么?
  6. 应用软件使计算机的内存分配更合理,应用软件使计算机的内存分配更合理,运行更加稳定()...
  7. oracle不属于集合操作,Oracle的几个集合操作
  8. 【离散数学中的数据结构与算法】十一 错排问题
  9. 【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题
  10. java ReentrantLock 使用