Golang科学计数法转换string数字输出的实现
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科学计数法转换 内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!
推荐阅读
-
洗衣机不脱水了是怎么回事(洗衣机不甩干的处理方法)
洗衣机作为大家日常生活必备的家用电器,其利用率频繁,难免会因为机械磨损、缺乏润滑油、机件老化、弹簧疲劳变形等原因,出现各种不正...
-
电子表格零基础自学教程(小白也能学明白)
可能很多人(包括我)觉得Excel不就是做个表吗,没什么好学的。然而很多大型企业在面试的时候还是会问,“会Excel吗?”“会...
-
笔记本电脑报价大全(联想笔记本多少钱)
(注意:建议在旗舰店、官方旗舰店、官网购买) 一、游戏本设计本、办公本推荐如下: 华为品牌:(全球第一大电信设备商) 1...
-
煲机软件哪个好(让耳机有个思想准备)
《无间道》中陈永仁与刘建明有过一句经典对白——“高音甜、中音准、低音沉,总之一个词通透”。这一句话也一...
-
viewsonic平板电脑(viewsonic平板电脑刷机)
ViewSonic是一个视讯品牌,中文名字:优派。 ViewSonic 一、读音:英[vju:][?s?n?k],美[vj...
-
采访麦克风户外哪款好(讯飞智能无线麦克风C1采访神器)
对于视频创作者、直播工作者、远程培训老师、记者等媒体工作者来说,工作过程中,最让人费心的莫过于如何确保收音纯正、字幕快速生成、...
-
电脑硬件配置怎么查(详述两招快速查看电脑配置参数信息)
大家好,今天跟大家分享两个快速查看电脑配置参数信息的办法。 操作步骤如下: 1右击电脑屏幕最下方任务栏左侧的电脑徽标按钮,...
-
数据线没坏但充不上电怎么办(数据线充不上电处理方法)
苹果充电器突然充不上电是比较尴尬的问题,首先看自己的充电器数据线是不是原装,如果非原装在第一次充电时,苹果手机会提示你是否要适...
-
电脑开机出现黑屏如何处理(电脑不能开机黑屏解决方法)
电脑不能开机或者开机以后黑屏怎么解决?这里收集了所有常见的维修方法,看完秒变维修高手,实在是一篇不能错过的电脑维修教程。简单易...
-
手机宝典怎么搞(小米手机性能优化宝典)
别再总是抱怨手机卡顿,系统臃肿,反应慢,现在看完这篇文章,你会发现你并不了解小米手机,当然,文中许多方法并不是仅仅适用于小米手...