
每天php 科学计数法 转 string,我们都会遇到一些怪异的错误,然后遇到数字成为科学计数法的问题. 问题源于当前输出的数字太大而无法保存的事实. 例如
回声14735037137891444444;
回声0.00000000000000000000000000001;
然后输出为:
1.4735037137891E+19 1.0E-29
这种情况也很普遍,但是是由于数字太大或太小,然后的存储字段直接是一个字符串,结果出现了各种魔术问题.
然后,我在Internet上发现了同样神奇的功能. 它起作用了,但是到处都是空洞. 然后我自己写了它,逻辑有点复杂,但是它不涉及数字运算,因此应该保证准确性.
<? php
/ **
*将数字从科学计数法转换为普通数
*为了完善数字处理,可以使用一些正则化
* @author loveyu
* @param字符串$号

* @返回字符串
* /
函数convert_scientific_number_to_normal($数字)
{
if(stripos($ number,'e')=== false){
//判断是否为科学计数法
返回$号;
}
if(!preg_match(
“ / ^([\\ d. ] +)[eE]([\\ d \\-\\ +] +)$ /”,
str_replace(数组(“”,“,”),“”,修剪($数字)),$个匹配项)
){
//以科学计数法提取有效数据,如果无法处理则直接返回

返回$号;
}
//处理数字前后的0和点以防止数据干扰. 实际上,正确的科学计数方法没有这个问题
$ data = preg_replace(数组(“ / ^ [0] + /”),“”,rtrim($匹配[1],“ 0. ”));
$ length =(int)$匹配[2];
if($ data [0] ==“. ”){
//由于第一个0可能会被替换,因此这里是要填充0的小数位
$ data =“ 0 {$ data}”;
}
//这里有一种特殊的可能性,无需处理
if($ length == 0){
返回$数据;
}

//记住当前小数点的位置,用于判断左右移动
$ dot_position = strpos($数据,“. ”);
if($ dot_position === false){
$ dot_position = strlen($数据);
}
//不需要用于正式数据处理,它将在最终输出时添加
$ data = str_replace(“. ”,“”,$ data);
if($ length> 0){
//如果科学计数长度大于0
//获取要添加的0数,并在数据之后添加
$ repeat_length = $ length-(strlen($ data)-$ dot_position);
if($ repeat_length> 0){
$个数据. = str_repeat('0'php 科学计数法 转 string,$ repeat_length);

}
//小数点后移n位
$ dot_position + = $长度;
$ data = ltrim(substr($ data,0,$ dot_position),“ 0”). “. ”. substr($ data,$ dot_position);
} elseif($长度<0){
//当前为负数
//获取要重复的0数
$ repeat_length = abs($长度)-$ dot_position;
if($ repeat_length> 0){
//此处的值可能小于0,因为小数点太长
$ data = str_repeat('0',$ repeat_length). $数据;
}
$ dot_position + = $长度; //这里的length是一个负数,请直接操作
if($ dot_position <1){
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-210271-1.html
老成持重并不优于年轻热血
以贩毒罪判处终生监禁
你是怎么算出来这结果的