golang踩坑之floa64精度丢失

问题:19.90转为float64类型,再乘以100,精度丢失

废话不说多,show you the code

package main

import (
    "fmt"
    "strconv"
)

func main() {
    num, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 19.90), 64)
    fmt.Println(num)
    fmt.Println(num * 100)
}

运行输出

19.9
1989.9999999999998

19.9转成float64后,再乘以100,居然变成了1989.9999999999998
这个精度的问题要是出现在现金的问题上就厉害了!

解决

使用包的decimal类型:github.com/shopspring/decimal

代码改为如下

package main

import (
    "fmt"
    "github.com/shopspring/decimal"
    "strconv"
)

func main() {
    num, _ := strconv.ParseFloat(fmt.Sprintf("%.8f", 19.90), 64)
    fmt.Println(num)

    decimalValue := decimal.NewFromFloat(num)
    decimalValue = decimalValue.Mul(decimal.NewFromInt(100))

    res,_ := decimalValue.Float64()
    fmt.Println(res)
}

运行输出

19.9
1990

原文地址:https://www.cnblogs.com/chenqionghe/p/12167693.html

时间: 2024-10-09 21:21:11

golang踩坑之floa64精度丢失的相关文章

ELK之ES2.4.1双实例平滑升级至5.2.1踩坑并supervisor管理记

ES老集群用的2.4.1版本,跑的比较好就一直没动,最近看资料ES5.X已经稳定,并且性能有较大提升,心里就发痒了,但由于业务要保持高可以用的属性,就得想一个平滑升级的方案,最后想到了多实例过度的办法,5.X版本网上介绍配置变化较大,也做好了踩坑准备,确定好要升级后,立刻动手. 一.对应升级改造方案 使用端口9220和9330 安装并配置好新的ES5.2.1实例-->关掉logstash并将ES2.4.1实例堆栈调小重启(kafka保留3个小时日志所以不会丢失)-->启动ES5.2.1并将lo

运维小白部署网站踩坑全过程

作为一名一个星期之前还是个运维小白的我,经过一番摸爬滚打终于把我的小网站部署上去了 一.服务器环境 OK,一开始我得到的是一台centos的服务器,没有装apache/nginx.mysql和php环境,一开始我是使用lnmp一键安装包,结果发现php好多扩展和依赖缺失,重装了php后才解决了问题,mysql也遇到一些问题,所以建议大家在装环境时除非一键lamp/lnmp安装包经历过实践的考验,不然还是老老实实地一个一个组件安装,php.mysql.nginx. lnmp/lamp安装成功的标志

iOS开发-OpenGLES 入门踩坑

Flat coloring(单色) 是通知OpenGL使用单一的颜色来渲染,OpenGL将一直使用指定的颜色来渲染直到你指定其它的颜色. 指定颜色的方法为 public abstract void glColor4f(float red, float green, float blue, float alpha). 缺省的red,green,blue为1,代表白色. Smooth coloring (平滑颜色过渡) 当给每个顶点定义一个颜色时,OpenGL自动为不同顶点颜色之间生成中间过渡颜色(

AeroSpike踩坑手记1:Architecture of a Real Time Operational DBMS论文导读

又开了一个新的坑,笔者工作之后维护着一个 NoSQL 数据库.而笔者维护的数据库正是基于社区版本的 Aerospike打造而来.所以这个踩坑系列的文章属于工作总结型的内容,会将使用开发 Aerospike 的各种问题进行总结梳理,希望能够给予大家启发和帮助.第一篇开山之文,就先从Aerospike 公司在16年数据库顶会 VLDB的一篇论文 <Aerospike: Architecture of a Real Time Operational DBMS>展开,来高屋建瓴的审视一下 Aeropi

TiDB 深度实践之旅--真实“踩坑”经历

美团点评 TiDB 深度实践之旅(9000 字长文 / 真实“踩坑”经历) 4 PingCAP · 154 天前 · 3956 次点击 这是一个创建于 154 天前的主题,其中的信息可能已经有所发展或是发生改变. 原标题:美团点评携手 PingCAP 开启新一代数据库深度实践之旅 一.背景和现状 在美团,基于 MySQL 构建的传统关系型数据库服务已经难于支撑公司业务的爆发式增长,促使我们去探索更合理的数据存储方案和实践新的运维方式.随着近一两年来分布式数据库大放异彩,美团 DBA 团队联合架构

windows container 踩坑记

windows container 踩坑记 Intro 我们有一些服务是 dotnet framework 的,不能直接跑在 docker linux container 下面,最近一直在折腾把它部署在 windows container 下,折腾的有点恶心,记录一下. Windows Container 介绍 Windows Container 是微软在 Windows 上的虚拟化实践,它可以提供操作系统级别的虚拟化. 通过我们说的容器化大多是指 Linux Container,基于 linu

Go“一个包含nil指针的接口不是nil接口”踩坑

最近在项目中踩了一个深坑--"Golang中一个包含nil指针的接口不是nil接口",总结下分享出来,如果你不是很理解这句话,那推荐认真看下下面的示例代码,避免以后写代码时踩坑. 示例一 先一起来看下这段代码,你感觉有没有问题呢? type IPeople interface { hello() } type People struct { } func (p *People) hello() { fmt.Println("github.com/meetbetter"

米忽悠踩坑日记-1

米忽悠踩坑日记-1            --知不足,而后进 进入米哈游差不多一个半月了,就以刚刚上线的某个任务作为节点写一篇踩坑日记吧. 1.安全意识,尽量考虑到玩家各种奇奇怪怪的操作以及有可能想刷道具的行为. 2.日志方面,记录玩家的每一步操作,成功或者失败,需要记录清楚,uid,region以及其他的信息,如奖励的ID,更新一次游戏玩家数据也记录 3.在写代码时候不要总想着先实现逻辑再来优化结构,因为一个小任务的代码量不一定少,而且任务排的很紧,如果不从一开始就保持良好的结构自己看起来简直

vue配置环境踩坑

Vue 环境配置踩坑 目录 Vue 环境配置踩坑 windows下cnpm -v :无法将"cnpm"项识别为 cmdlet.函数.脚本文件或可运行程序的名称. windows下cnpm -v :无法将"cnpm"项识别为 cmdlet.函数.脚本文件或可运行程序的名称. npm和cnpm都是在git的全局环境下下载的 且安装完cnpm,nodejs文件夹下就已经有了node_cache.node_global这两个文件夹: 而且在用户变量里path变量路径已经存在