Golang 浮点数运算 避免精度损失 Decimal包
Golang 小数计算现状:
存在精度损失
d := 1129.6
fmt.Println((d * 100)) //输出:112959.99999999999var d float64 = 1129.6
fmt.Println((d * 100)) //输出:112959.99999999999m1 := 8.2
m2 := 3.8
fmt.Println(m1 - m2) // 期望是4.4,结果打印出了4.399999999999999
解决方案:
Decimal
由于golang中默认没有decimal类型,如果想使用decimal类型需要通过第三方包
go get github.com/shopspring/decimal
decimal使用方式
package mainimport ("fmt""github.com/shopspring/decimal"
)func main() {var v1 = decimal.NewFromFloat(0.1)var v2 = decimal.NewFromFloat(0.2)var v3 = v1.Add(v2) // 0.3var v4 = v1.Sub(v2) // -0.1var v5 = v1.Mul(v2) // 0.02var v6 = v1.Div(v2) // 0.5var v7 = decimal.NewFromFloat(3.4625)var data1 = v7.Round(1) // 3.5 保留一位小数,四舍五入var data2 = v7.Truncate(1) // 3.4 保留一位小数,直接舍弃fmt.Println(v3, v4, v5, v6)fmt.Println(data1, data2)
}
注意:
运算过程中数据全部变为 decimal.Decimal 格式,在最后计算时需要将其转换成需要的格式
package mainimport ("fmt""github.com/shopspring/decimal"
)func main() {var v1 = decimal.NewFromFloat(0.1)var v1 = decimal.NewFromFloat(0.1)var resp1 float64var resp2 stringresp1, _ = v1.Float64() // note: 注意这边第二个参数并不是ok,而是是否准确resp2 = v1.String()fmt.Printf("resp1 = %v, type = %v\n", resp1, reflect.TypeOf(resp1).String())// output: resp1 = 0.1, type = float64fmt.Printf("resp2 = %v, type = %v\n", resp2, reflect.TypeOf(resp2).String())// output: resp2 = 0.1, type = string
}
Golang 浮点数运算 避免精度损失 Decimal包相关推荐
- 64位浮点数_JavaScript 浮点数运算的精度问题
问题描述 在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 ...
- 浮点数运算的精度问题:以js语言为例
在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 1.00 ...
- java小数丢失精度_Java中的小数运算与精度损失
float.double类型的问题 我们都知道,计算机是使用二进制存储数据的.而平常生活中,大多数情况下我们都是使用的十进制,因此计算机显示给我们看的内容大多数也是十进制的,这就使得很多时候数据需要在 ...
- 浮点数运算的精度问题
问题描述 在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 ...
- c语言浮点数乘法运算,记C语言浮点数运算处理 坑 一则
看一小段C语言程序: int main() { float x = 1.3; x = x - (int)x; int i = (int)(x*); return ; } 在你心目中, 变量 I 是怎样 ...
- python 精度损失_Python的浮点数损失精度问题
本篇讨论的现象可以从下面这段脚本体现出来: >>> x = 0.0 >>> for i in range(10): x += 0.1 print(x) 0.1 0. ...
- python3的float数精度_Python3 - 执行精确的浮点数运算
问题 对浮点数执行精确的计算操作,并且不希望有任何小误差的出现. 解决方案 浮点数的一个普遍问题是它们并不能精确的表示十进制数.并且,即使是最简单的数学运算也会产生小的误差. a = 2.1 b = ...
- 关于Java浮点数运算精度丢失问题
2019独角兽企业重金招聘Python工程师标准>>> 关于Java浮点数运算精度丢失问题 博客分类: java 前几天看了一个朋友的博客,说Java中浮点数运算精度丢失的问题,他给 ...
- MATLAB浮点数运算精度问题
matlab计算题: 而后用matlab进行了一些浮点数计算,但结果都出乎预料: 2+2*eps = 2.000 3 + eps = 3 ...
最新文章
- 隔离太无聊?每天一个数据科学项目,数据集都准备好了!
- JS中同步与异步的理解
- [C#][Newtonsoft.Json] Newtonsoft.Json 序列化时的一些其它用法
- html单击按钮时弹出输入框,点击按钮弹出模态框的一系列操作代码实例
- Java分布式篇5——FastDFS
- linux 改变文本模分辨率
- jdk和jre和jvm区别_JDK,JRE和JVM之间的区别
- c语言链栈,链栈 C语言实现
- 关于帧差法的想法(opencv)
- mac软件推荐及chrome插件推荐
- 王垠:怎样尊重一个程序员
- JavaScript初学入门(JS打印9*9乘法表,JS制作简易计算器)
- 扔垃圾前得先“刷脸”?北京这个小区垃圾分类真的用上了“人脸识别”!
- CES2018,三星为何将MicroLED应用于电视而非手机?
- 机器人或自动化类简历面试小技巧
- 解决:word表格,未完成一页就跳到下一页
- MySQL 数据类型(转)
- CS231n的第三次作业之循环神经网络
- Chinese Dragon
- 标签打印软件如何批量打印小程序码图片