Golang科学计数法转换string数字输出的实现

目录
  • 1、问题
  • 2、问题修复
  • 3、总结

1、问题

最近接手一个商城运单号模块,接手后发现有部分运单号返回给前端是按照科学计数法的方式返回,如:8.0497183772403904E+17,后查库发现这些运单号在excel导入的时候就是按照科学计数法导入,没做任何处理。
按照科学计数法的形式返回给用户运单号,这样太不友好了,简直就是bug,所以需要进行转换处理后再返回给用户。

2、问题修复

面向谷歌编程,找到了以下方法进行转换:

第一种:

oldNum := float64(8.0497183772403904E+17)
newNum := big.NewRat(1, 1)
newNum.SetFloat64(oldNum)
fmt.Println(newNum.FloatString(0))

结果:
804758523075821952

第二种:

var newNum float64
numStr := "8.04758523075822e+17"
_, err := fmt.Sscanf(numStr, "%e", &newNum)
if err != nil {
log.Errorf("fmt.Sscanf error, numStr:%s, err:%v", numStr, err)
return
}
num := fmt.Sprintf("%.f", newNum)
fmt.Println(num)

结果:
804758523075821952

以上两种转出来的都会精度有所丢失,具体原因未知,现在还未去深究,有知道的朋友希望可以评论回复解答一下,谢谢。

第三种:

以上两种都存在丢失的问题,起初是不知道的,后面通过java进行转换了才发现真的丢失了java代码如下:

BigDecimal bd = new BigDecimal("8.04758523075822e+17");
System.out.println(bd.toPlainString());

结果:
804758523075822000

java既然可以通过BigDecimal进行转换,那golang肯定也可以(很不幸我使用的是go1.11.2没找到decimal的相关包支持,只能面向github编程了),在github中找到了一个较多人使用的包 github.com/shopspring/decimal
使用代码如下:

//先安装包 go get github.com/shopspring/decimal
numStr := "8.04758523075822e+17"
decimalNum, err := decimal.NewFromString(numStr)
if err != nil {
log.Errorf("decimal.NewFromString error, numStr:%s, err:%v", numStr, err)
return
}
fmt.Println(decimalNum.String())

结果:
804758523075822000

3、总结

在进行科学计数法的数字转string数字的时候,最好还是使用第三种方法,这样不会精度丢失的情况。当然导入excel的业务上要做好判断处理,若是纯数字运单号入库就应该是纯数字而不是科学计数法的形式。

package main

import (
    "encoding/json"
    "fmt"
    "github.com/shopspring/decimal"
    "strconv"

    //"github.com/shopspring/decimal"
)

type  abc struct {
    Goods_id float64 `json:"goods_id"`
    Goods_name string `json:"goods_name"`
}

func main(){
    a := `{"goods_id":1.1572417766286e+18,"goods_name":"LM358"}`

    aaa := &abc{}
    err := json.Unmarshal([]byte(a),aaa)

    if err !=nil{
        fmt.Println(err)
    }

    fmt.Println(aaa)
    decimalNum, err :=decimal.NewFromString(strconv.FormatFloat(aaa.Goods_id, 'e', -1, 64))
    if err != nil {
        return
    }
    fmt.Println(decimalNum.String())

}

D:\gocode1.14\go-micro-code\gjj>go run main.go
&{1.1572417766286e+18 LM358}
1157241776628600000

到此这篇关于Golang科学计数法转换string数字输出的实现的文章就介绍到这了,更多相关Golang科学计数法转换 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • PHP实现将科学计数法转换为原始数字字符串的方法

    本文实例讲述了PHP实现将科学计数法转换为原始数字字符串的方法,分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: function NumToStr($num){     if (stripos($num,'e')===false) return $num;     $num = trim(preg_replace('/[=\'"]/','',$num,1),'"');//出现科学计数法,还原成字符串     $result = "";     wh

  • Linux下科学计数法(e)转化为数字的方法

    科学计数法使用e标识数值,将科学计算学转化为数字的思路:按e右边的数字移动小数点位数.e右边的数字如果是负数,则向左移动小数点.示例如下: 1.2345678e2 = 123.45678 1.2345678e-2 = 0.012345678 1.7615562e+06 = 1761556.2 1.87982e7 = 18798200 1e3 = 1000 那么在shell中,如何转化科学计数法为数字呢,方法如下:这里以"1.7615562e+06" (或者1.7615562e6)为示例

  • PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法

    本文实例讲述了PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法.分享给大家供大家参考,具体如下: PHP计算大数值运算时会出错,当数字太大时,数值会变成科学计数.那怎么来进行PHP超大数值运算,包括加减乘除,幂运算,平方根,取模运算呢? 要解决科学计数的问题,只要赋值时加一对引号即可. 如: <?php $n = '22222222222222222222222222220'; echo $n; ?> 如果不加引号,显示2.2222222222222E+28,加引号后显示22222

  • java中将科学计数法转换普通计数法的简单方法

    今天发现数据库里汇总的数据有点大,一输出就被自动转化成科学计数法了.后来发现是转换字符串的方法有问题.如下: String a = "11234567.89"; BigDecimal db = new BigDecimal(a); System.out.println("科学计数:" + db.toString()); System.out.println("普通计数:" + db.toPlainString()); 输出: 科学计数:1.123

  • python 不以科学计数法输出的方法

    其实很简单只需两个语句: import numpy as np np.set_printoptions(suppress=True) 这样就可以搞定 以上这篇python 不以科学计数法输出的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 解决Java中由于数据太大自动转换成科学计数法的问题

    1.java后台 (1)使用BigDecimal类 方式一:String str=new BigDecimal(num+"").toString(); 方式二:String str=new BigDecimal(num.toString()).toString(); (2)使用DecimalFormat类 //注意,这种方式是保留几位小数 String str=new DecimalFormat("0.00").format(num); 2.JSP页面 (1)使用j

  • C#实现把科学计数法(E)转化为正常数字值

    1.字符串值中包含E等科学计数法,比如12E-2,需要进行转化为普通数值0.12, 2.转化函数如下: 复制代码 代码如下: private Decimal ChangeDataToD(string strData)         {             Decimal dData = 0.0M;             if (strData.Contains("E"))             {                 dData = Convert.ToDecim

  • 完美解决python中ndarray 默认用科学计数法显示的问题

    机器环境: Python 3.6.4 numpy==1.14.0 pandas==0.22.0 解决方法: np.set_printoptions(suppress=True) 默认情况下,ndarray数组采用科学计数法显示: 加入代码后: 以上这篇完美解决python中ndarray 默认用科学计数法显示的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Golang科学计数法转换string数字输出的实现

    目录 1.问题 2.问题修复 3.总结 1.问题 最近接手一个商城运单号模块,接手后发现有部分运单号返回给前端是按照科学计数法的方式返回,如:8.0497183772403904E+17,后查库发现这些运单号在excel导入的时候就是按照科学计数法导入,没做任何处理. 按照科学计数法的形式返回给用户运单号,这样太不友好了,简直就是bug,所以需要进行转换处理后再返回给用户. 2.问题修复 面向谷歌编程,找到了以下方法进行转换: 第一种: oldNum := float64(8.049718377

  • php使用json_decode后数字对象转换成了科学计数法的解决方法

    本文实例讲述了php使用json_decode后数字对象转换成了科学计数法的解决方法.分享给大家供大家参考,具体如下: 问题: 今天在搞网页游戏在facebook积分上的对接,facebook传过来一个类json字符串,想在callball.php页面当中应用这些参数,于是进行了一次json_decode操作,发现长长的数字都变成了科学计数法,这不是我想要的结果. 解决方法: 做了各方面的转换处理都不好使: $obj='{"order_id":213477815351175,"

  • 转换科学计数法的数值字符串为decimal类型的方法

    在操作数据库时,需要将字符串转换成decimal类型. 代码如下: select cast('0.12' as decimal(18,2)); select convert(decimal(18,2), '0.12'); 当需要将科学计数法的数字字符串转换成decimal时,这2种写法都报错: msg 8114, level 16, state 5, line 1 error converting data type varchar to numeric. select cast('0.12e+

  • R语言-如何将科学计数法表示的数字转化为文本

    统赛B组我们选择了图书馆课题,获得了数据,一时兴起尝试处理了一下门禁的数据,遇到了一些问题,特此记下,方便以后查阅. 门禁数据分为两个变量,第一列为学号,第二列为进门时间,原本是Excel文件,为了方便读入R我把它另存为了csv文件,但在读入R以后出现了一些问题 1.学号被存储为了科学计数法表示的数字 2.时间显示的也不全面,有些乱码 时间问题可以在Excel中把单元格格式设置一下就解决了,但是学号问题却遇到了一些小麻烦,我本来是想用 menjin$studentcode <- as.chara

  • 解决java读取EXCEL数据变成科学计数法的问题

    1.如下图中的检测值存到数据库是科学计数法 2 经过代码处理后 3 只需要对你读到的字符串进行如下操作 BigDecimal bd = new BigDecimal("读到的值"); String checkValue = bd.toPlainString(); 补充:java excel 导出时长数字变成科学计数法的解决方法 今天在做excel导出的时候,导出的表格中长度大于11的数字会自动用科学计数法显示. 一开始,我想着直接将数据全部转为string类型,没想到还是无法解决问题(

  • 基于Java将Excel科学计数法解析成数字

    需要注意的是一般的科学表达式是 1.8E12 1.8E-12 而在Excel中的科学表达式是 1.8E+12 1.8E-12 我写的科学计数法的正则表达式是 (-?\d+\.?\d*)[Ee]{1}[\+-]?[0-9]* 导入EXCEL数据时将科学计数法解析成数字,Java代码: import java.text.DecimalFormat; import java.util.regex.Pattern; public class Test { static Pattern pattern =

随机推荐