使用 decimal 包解决 go float 浮点数运算失真

问题

go float 在运算的时候会出现精度问题

go 复制代码
package main

import (
    "fmt"
)

func main() {
    var a float64 = 0.3
    var b float64 = 0.6
    fmt.Println("a+b=", a+b) // 你以为是 0.9  但是结果是:0.8999999999999999
}

你观察到的 0.3 + 0.6 = 0.8999999999999999 现象是由于计算机使用二进制浮点数表示十进制小数时的固有精度问题,而不是 Go 语言特有的问题。这是所有使用 IEEE 754 浮点数标准的编程语言都会遇到的情况

解决

使用 decimal 包解决 golang 浮点数运算失真

代码如下:

go 复制代码
package main

import (
    "fmt"

    "github.com/shopspring/decimal"
)

func main() {
    var a float64 = 0.3
    var b float64 = 0.6
    a1 := decimal.NewFromFloat(a)
    b1 := decimal.NewFromFloat(b)
    fmt.Println("a+b=", a1.Add(b1)) //  0.9
}

注意

decimal建议只用做 float 计算;不建议用来字符串和浮点数之间转换: decimal.NewFromString("1") , 大量数据计算下性能差

原文地址

使用 decimal 包解决 go float 浮点数运算失真

相关推荐
2401_895521347 小时前
SpringBoot Maven快速上手
spring boot·后端·maven
disgare8 小时前
关于 spring 工程中添加 traceID 实践
java·后端·spring
ictI CABL8 小时前
Spring Boot与MyBatis
spring boot·后端·mybatis
小江的记录本10 小时前
【Linux】《Linux常用命令汇总表》
linux·运维·服务器·前端·windows·后端·macos
yhole13 小时前
springboot三层架构详细讲解
spring boot·后端·架构
香香甜甜的辣椒炒肉13 小时前
Spring(1)基本概念+开发的基本步骤
java·后端·spring
白毛大侠13 小时前
Go Goroutine 与用户态是进程级
开发语言·后端·golang
ForteScarlet14 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·开发语言·后端·ios·开源·kotlin
大阿明14 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
Binary-Jeff14 小时前
Spring 创建 Bean 的关键流程
java·开发语言·前端·spring boot·后端·spring·学习方法