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包相关推荐

  1. 64位浮点数_JavaScript 浮点数运算的精度问题

    问题描述 在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 ...

  2. 浮点数运算的精度问题:以js语言为例

    在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 1.00  ...

  3. java小数丢失精度_Java中的小数运算与精度损失

    float.double类型的问题 我们都知道,计算机是使用二进制存储数据的.而平常生活中,大多数情况下我们都是使用的十进制,因此计算机显示给我们看的内容大多数也是十进制的,这就使得很多时候数据需要在 ...

  4. 浮点数运算的精度问题

    问题描述 在 JavaScript 中整数和浮点数都属于 Number 数据类型,所有数字都是以 64 位浮点数形式储存,即便整数也是如此. 所以我们在打印 1.00 这样的浮点数的结果是 1 而非 ...

  5. c语言浮点数乘法运算,记C语言浮点数运算处理 坑 一则

    看一小段C语言程序: int main() { float x = 1.3; x = x - (int)x; int i = (int)(x*); return ; } 在你心目中, 变量 I 是怎样 ...

  6. python 精度损失_Python的浮点数损失精度问题

    本篇讨论的现象可以从下面这段脚本体现出来: >>> x = 0.0 >>> for i in range(10): x += 0.1 print(x) 0.1 0. ...

  7. python3的float数精度_Python3 - 执行精确的浮点数运算

    问题 对浮点数执行精确的计算操作,并且不希望有任何小误差的出现. 解决方案 浮点数的一个普遍问题是它们并不能精确的表示十进制数.并且,即使是最简单的数学运算也会产生小的误差. a = 2.1 b = ...

  8. 关于Java浮点数运算精度丢失问题

    2019独角兽企业重金招聘Python工程师标准>>> 关于Java浮点数运算精度丢失问题 博客分类: java 前几天看了一个朋友的博客,说Java中浮点数运算精度丢失的问题,他给 ...

  9. MATLAB浮点数运算精度问题

    matlab计算题:              而后用matlab进行了一些浮点数计算,但结果都出乎预料:          2+2*eps = 2.000          3 + eps = 3 ...

最新文章

  1. 隔离太无聊?每天一个数据科学项目,数据集都准备好了!
  2. JS中同步与异步的理解
  3. [C#][Newtonsoft.Json] Newtonsoft.Json 序列化时的一些其它用法
  4. html单击按钮时弹出输入框,点击按钮弹出模态框的一系列操作代码实例
  5. Java分布式篇5——FastDFS
  6. linux 改变文本模分辨率
  7. jdk和jre和jvm区别_JDK,JRE和JVM之间的区别
  8. c语言链栈,链栈 C语言实现
  9. 关于帧差法的想法(opencv)
  10. mac软件推荐及chrome插件推荐
  11. 王垠:怎样尊重一个程序员
  12. JavaScript初学入门(JS打印9*9乘法表,JS制作简易计算器)
  13. 扔垃圾前得先“刷脸”?北京这个小区垃圾分类真的用上了“人脸识别”!
  14. CES2018,三星为何将MicroLED应用于电视而非手机?
  15. 机器人或自动化类简历面试小技巧
  16. 解决:word表格,未完成一页就跳到下一页
  17. MySQL 数据类型(转)
  18. CS231n的第三次作业之循环神经网络
  19. Chinese Dragon
  20. 标签打印软件如何批量打印小程序码图片

热门文章

  1. HI3516DV300 GPIO操作
  2. 硬件中断和软件中断的区别?
  3. java 中 print、println 与 printf 的区别
  4. docker-desktop和docer历史版本下载
  5. 数值分析(二) 三次样条插值法matlab程序
  6. 300题目 第10讲 积分等式与积分不等式
  7. STM32---c语言指针1
  8. 10个有效管理人员的 “黄金 “法则|优思学院
  9. 多分类问题中sklearn的RFECV指定scoring函数
  10. zookeeper Unreasonable length错误导致无法启动