php科学计数法转string,php如何将科学计数法转数字

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

16fca8c065819d8da34410f51c883664.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php8vsgo,服务端 I/O 性能:Node、PHP、Java、Go 的对比

原标题&#xff1a;服务端 I/O 性能&#xff1a;Node、PHP、Java、Go 的对比了解应用程序的输入/输出(I/O)模型意味着理解应用程序处理其数据的载入差异&#xff0c;并揭示其在真实环境中表现。或许你的应用程序很小&#xff0c;在不承受很大的负载时&#xff0c;这并不是个严重…

Python day8

阅读目录 为什么要用函数  函数的定义与调用  函数的返回值  函数的参数  本章小结返回顶部为什么要用函数 现在python届发生了一个大事件&#xff0c;len方法突然不能直接用了。。。 然后现在有一个需求&#xff0c;让你计算hello world的长度&#xff0c;你怎么计算&…

java创建对象过七夕,想 new 个对象过七夕,她却抛了异常

原标题&#xff1a;想 new 个对象过七夕&#xff0c;她却抛了异常关注 “”导读&#xff1a;单身之痛......作者 | 轩辕之风来源 | 编程技术宇宙(ID&#xff1a;xuanyuancoding)七夕又到了&#xff0c;单身汪们太难了&#xff0c;每年不仅要经历双十一&#xff0c;要经历2.14&a…

【Redis】解析Redis和Java传递数据

在Java中使用Redis之前需要导入 jedis.jar 包&#xff0c;由于Redis是基于key-value进行数据存储&#xff0c;java中的数据存储到Redis中有许多方式&#xff0c;这里笔者介绍采用JSON字符串和对象序列化两种方式。 1&#xff0c;使用JSON方式 首先将Java对象转化为JSON字符串 …

C#带按钮的文本框TextBoxContainButton

经常需要用到各种组合控件&#xff0c;每次组合太麻烦&#xff0c;通过打包成自定义控件&#xff0c;方便调用。 带按钮的文本框&#xff0c;如下图&#xff1a; 文本框内可以输入文本&#xff0c;响应文本框内容变化事件&#xff0c;按钮可以设置点击事件&#xff0c;图标 通过…

Windows单机配置Zookeeper环境

转自&#xff1a;http://www.jianshu.com/p/f7037105db46 首先要确保机器已经安装好java环境&#xff0c;并且配置好环境变量 http://apache.fayea.com/zookeeper/current/ 下载后&#xff0c;解压缩到硬盘&#xff0c;我这里解压到了 D:\WorkSoftware\zookeeper_3.4.9 解压缩在…

三层架构—简析

三层学习完了&#xff0c;第一次验收的时候&#xff0c;自己理解的也不是非常到位&#xff0c;后来又又一次敲了一遍登陆样例&#xff0c;查阅了一些资料 进行第二次验收才感觉清晰了很多。之前画时序图时我就想过时序图基本上也是非常好的体现了三层&#xff0c;当时也和别人讨…

机房收费系统之结账

其实&#xff0c;我认为机房收费系统中结账的部分是耗我精力最多的。首先我就不明确结账是干嘛的&#xff0c;所以一上来就晕乎乎。后来看了一篇博客说结账方便老板管理的才明确了为什么是“操作员”。这里面要理清的一点&#xff0c;结账的内容是未结账的。 暂时汇总的信息&am…

Java线上应用故障排查之一:高CPU占用

一个应用占用CPU很高&#xff0c;除了确实是计算密集型应用之外&#xff0c;通常原因都是出现了死循环。 以我们最近出现的一个实际故障为例&#xff0c;介绍怎么定位和解决这类问题。 根据top命令&#xff0c;发现PID为28555的Java进程占用CPU高达200%&#xff0c;出现故障。 …

Java并发编程实战 代码bug,Java并发编程实战(1)- 并发程序的bug源头

概述并发编程一般属于编程进阶部分的知识&#xff0c;它会涉及到很多底层知识&#xff0c;包括操作系统。编写正确的并发程序是一件很困难的事情&#xff0c;由并发导致的bug&#xff0c;有时很难排查或者重现&#xff0c;这需要我们理解并发的本质&#xff0c;深入分析Bug的源…

ajax小结

转载于:https://www.cnblogs.com/infernoyy/p/7250548.html

app推送以及提示音java,springboot 整合 Jpush 极光推送

产品简介&#xff1a;JPush 是经过考验的大规模 App 推送平台&#xff0c;每天推送消息数超过 5 亿条。 开发者集成 SDK 后&#xff0c;可以通过调用 API 推送消息。同时&#xff0c;JPush 提供可视化的 web 端控制台发送通知&#xff0c;统计分析推送效果。 JPush 全面支持 An…

Lydsy2017年4月月赛 抵制克苏恩

Description小Q同学现在沉迷炉石传说不能自拔。他发现一张名为克苏恩的牌很不公平。如果你不玩炉石传说&#xff0c;不必担心&#xff0c;小Q同学会告诉你所有相关的细节。炉石传说是这样的一个游戏&#xff0c;每个玩家拥有一个30 点血量的英雄&#xff0c;并且可以用牌召唤至…

怎样学习(3):迭代学习,精益求精

古人云「十年寒窗无人问。一举成名天下知」&#xff0c;这是中国古代为数不多的读书人的真实写照。大多数读书人仅仅有十年寒窗&#xff0c;却不见得成名。 在软件开发领域有瀑布模式的软件project方法论。它将软开发的几个过程「需求分析&#xff0c;概要设计&#xff0c;具体…

matlab宏参赛,MATLAB杯无人机大赛 | 决赛通知!

原标题&#xff1a;MATLAB杯无人机大赛 | 决赛通知&#xff01;重磅消息——决赛通知&#xff01;经过近5个多月的准备&#xff0c;MATLAB杯无人机比赛即将迎来精彩的决赛&#xff0c;来自全国10强的参赛队伍&#xff0c;齐聚羊城广州&#xff0c;美丽的中山大学&#xff0c;进…

php表格js特效,JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】

本文实例讲述了JavaScript表格隔行变色和Tab标签页特效。分享给大家供大家参考&#xff0c;具体如下&#xff1a;最近一直在看JavaScript知识&#xff0c;偶尔也穿插一点Jquery&#xff0c;感觉Jquery用起来真爽&#xff0c;减少了很多的代码量&#xff0c;而且学习也不是很高。…

java实现gdal栅格矢量化,《GDAL源码剖析与开发指南》一一1.5 GDAL源码目录

本节书摘来自异步社区出版社《GDAL源码剖析与开发指南》一书中的第1章&#xff0c;第1.5节&#xff0c;作者&#xff1a;李民录 更多章节内容可以访问云栖社区“异步社区”公众号查看。1.5 GDAL源码目录GDAL源码剖析与开发指南下载的GDAL源代码压缩包目录如图1-2所示&#xff0…

netlify支持php吗,hexo netlify 搭建简易博客

npm install hexo-cli -ghexo init blogcd blognpm installhexo server将本地文件夹推送到github修改主题git clone https://github.com/jangdelong/hexo-theme-xups.git themes/xups themes/xups修改yml配置文件重新hexo server自己的博客sleepy-poincare-e0ca11.netlify.c…

jps、jstack、jmap、jhat、jstat、hprof使用详解

https://my.oschina.net/feichexia/blog/196575#comment-list A、 jps(Java Virtual Machine Process Status Tool) jps主要用来输出JVM中运行的进程状态信息。语法格式如下&#xff1a; 如果不指定hostid就默认为当前主机或服务器。 命令行参数选项说明如下&#xff1a;…

oracle数据库日期格式的运算,Oracle时间类型date,timestamp时间差计算

Oracle的时间类型有两种date和timestamp. date精确到秒,timestamp精确到毫秒.1.计算date类型的时间差可以先把年,月,日,小时,分,秒用to_char函数拆分出来,再用to_number函数转换成数值类型.有了这些单独分开的时间就好办了.就再一个个的去减,记得考虑单位换算就行.比如都转换…