go语言写计算器 go语言math包

go是什么编程语言?主要应用于哪些方面?Go语言由Google公司开发,并于2009年开源,相比Java/Python/C等语言 , Go尤其擅长并发编程,性能堪比C语言,开发效率肩比Python,被誉为“21世纪的C语言” 。
Go语言在云计算、大数据、微服务、高并发领域应用应用非常广泛 。BAT大厂正在把Go作为新项目开发的首选语言 。
Go语言能干什么?
1、服务端开发:以前你使用C或者C++做的那些事情,用Go来做很合适,例如日志处理、文件系统、监控系统等;
2、DevOps:运维生态中的Docker、K8s、prometheus、grafana、open-falcon等都是使用Go语言开发;
3、网络编程:大量优秀的Web框架如Echo、Gin、Iris、beego等,而且Go内置的 net/http包十分的优秀;
4、Paas云平台领域:Kubernetes和Docker Swarm等;
5、分布式存储领域:etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;
6、区块链领域:区块链里面有两个明星项目以太坊和fabric都使用Go语言;
7、容器虚拟化:大名鼎鼎的Docker就是使用Go语言实现的;
8、爬虫及大数据:Go语言天生支持并发,所以十分适合编写分布式爬虫及大数据处理 。
go使用decimal在公司项目中看到关于钱的数据在接口展示、添加修改的各种情况下结构体中相应字段用的都是string类型 。觉得不太合理,因此查阅了一些资料,整理如下 。
在网上搜到一篇博客:
在程序计算中涉及到钱的时候,为什么要用Decimal而不是Float
博客中介绍,如果用float类型再转为decimal类型时会造成精度丢失 。转为string后再转为decimal则可以解决问题,保证精度 。看着好像是很完美的回答了我想要了解的问题,但仔细一看用的语言是python,于是我便亲自试了下:
结果确实如此 , 但看版本是2.7,我怀疑是不是python2.7版本落后 , 因此存在问题,于是又换了python3,再次测试:
结论依然是一样 。好吧,证实了,对于python确实应该先转为string再转为decimal 。
但是,python是这样,难道go也是这样吗,于是我又开始了进一步测试:
go中decimal使用第三方库
这里是直接用float64转为decimal,并没有通过string中转,结果输出如下:
乍一看,看着好像是精度丢失了似的 , 但是对比后我们发现 , float64和decimal前后都是一致的,也就是说float64转为decimal之后,保持了原样 。那些看起来小数点后位数很多的结果,是因为float64浮点类型计算产生的问题,跟转换并没有关系 。
为了验证这一结论 , 我又写了下面的测试:
不使用浮点类型相加,而用decimal类型相加,这样输出结果果然没问题了:
因此我们可以得出结论:对于go语言,在把float转换为decimal类型时 , 并不需要像python一样通过string中转,也依然可以保持精度 。进一步,我们也可以想到上面的问题,对于钱 , 在结构体字段中,我们完全可以直接使用float类型 , 并不需要用string类型 。而且好处时,使用float数值类型,无论对于前端还是后端,在进行数值范围验证的时候,会更方便,不必把string转为float后再验证了 。
上面提到了decimal包,我们这里简单看下,里面的常用的方法:
定义decimal的几种方式:
decimal数值运算
比较:
我们再看下浮点精度运算不准确的原因 , 这篇文章讲解的比较细
浮点精度(float、double)运算不精确的原因
精度运算不准确这是为什么呢?我们接下来就需要从计算机所有数据的表现形式二进制说起了 。如果大家很了解二进制与十进制的相互转换,那么就能轻易的知道精度运算不准确的问题原因是什么了 。

推荐阅读