golang 浮点数精度问题_golang 浮点数计算精度问题-程序员宅基地

技术标签: go  

一:先放解决的方法

把所有需要精确计算的数据先转成decimal,用decimal进行精确计算

更详情的用法参考包:github.com/shopspring/decimal

package main

import (
	"log"
	"github.com/shopspring/decimal"
)

func main() {
	xdecimal, err := decimal.NewFromString("1129.6")
	if err != nil {
		log.Println("转化decimal失败", err)
	}
	ydecimal  := decimal.NewFromFloat(3)
	
	resultdecimal := xdecimal.Mul(ydecimal)
	log.Println(resultdecimal)  //112960

}

二,Golang浮点数存在一些问题


1,两个浮点数相加减,可能不准确
(1)相减
x := 74.96
y := 20.48
b := x - y
fmt.Println(b) //output: 54.47999999999999
(2)相加
var a = 0.6
fmt.Println(a + 0.7) //output: 1.2999999999999998
· 出现浮点数不精确的原因是,浮点数储存至内存中时,2的-1、-2……-n次方不能精确的表示小数部分,所以再把这个数从地址中取出来进行计算就出现了偏差。

· 不是所有的float相加减乘除都一定出现偏差,具体要根据golang实现IEEE 754的情况定。
2,float32和float64直接互转会精度丢失, 四舍五入后错误
3,int64转float64在数值很大的时候出现偏差
4,两位小数乘100强转int, 比期望值少了1
    // case: float32==>float64
    // 从数据库中取出80.45, 历史代码用float32接收
    var a float32 = 80.45
    var b float64
    // 有些函数只能接收float64, 只能强转
    b = float64(a)
    // 打印出值, 强转后出现偏差
    fmt.Println(a) //output:80.45
    fmt.Println(b) //output:80.44999694824219
    // ... 四舍五入保留小数点后1位, 期望80.5, 结果是80.4
 
    // case: int64==>float64
    var c int64 = 987654321098765432
    fmt.Printf("%.f\n", float64(c)) //output:987654321098765440
 
    // case: int(float64(xx.xx*100))
    var d float64 = 1129.6
    var e int64 = int64(d * 100)
    fmt.Println(e) //output:112959

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/mario08/article/details/90170142

智能推荐

Flex之正在等待Adobe Flash Player 连接调试器..._adobe flex ocx-程序员宅基地

文章浏览阅读1.8k次。环境:Flash Bulider 4问题:运行调试的时候,进度窗口提示"正在等待Adobe Flash Player 连接调试器...",进度为57%分析:出现该问题的原因是没有安装Adobe Flash Player调试器解决:安装Adobe Flash Player调试器下载_adobe flex ocx

Hexo部署博客到Github和Coding,看这一篇就够了_coding github hexo 博客-程序员宅基地

文章浏览阅读2.5k次。前言这是一篇很详细的独立博客搭建教程,意在帮助小白们能快速入门,拥有自己的独立博客。作者已在window平台已搭建成功,博客效果请点链接查看。 为什么用Hexo搭建独立博客?Hexo 是一个快速、简洁且高效的博客框架。Hexo 使用 Markdown(或其他渲染引擎)解析文章,在几秒内,即可利用靓丽的主题生成静态网页。Github和Coding又是什么?Github是..._coding github hexo 博客

c++从txt文件读取一个矩阵数据_c++如何读取文件中的双精度浮点矩阵-程序员宅基地

文章浏览阅读7.2k次,点赞8次,收藏27次。#include <iostream>#include <vector>#include <fstream>#include <zconf.h>#include <string>#include <sstream>std::vector<std::vector<double >> readMatrixFile(const char *fileName) { // get current ._c++如何读取文件中的双精度浮点矩阵

bootstrap导航元素(14)_bootstrap 导航元素-程序员宅基地

文章浏览阅读177次。表格导航或标签创建一个标签式的导航菜单:以一个带有 class .nav 的无序列表开始。添加 class .nav-tabs。&lt;p&gt;标签式的导航菜单&lt;/p&gt;&lt;ul class="nav nav-tabs"&gt; &lt;li class="active"&gt;&lt;a href="#"&gt;Home&lt;_bootstrap 导航元素

CSDN如何转载别人的文章_csdn转载别人的博客-程序员宅基地

文章浏览阅读540次。经常看到有的博主的文章写的比较好,想要转发,存在自己的博客里面,但是博客又长又有图片,复制的话,太麻烦了?怎么办呢?以下是解决方案第一步、来到想要转发的文章里面,f12或者右键检查元素如上图所示,会出现html代码,如果出现html代码,就说明这一步成功操作了第二步,在红线的位置输入article_content,按回车键鼠标的光标会停在图上(蓝色光标的位置) 第三步、选中蓝色光标的位置,右键,复制-内部HTML 第四步、来到自己的博客的页面-发布博客选择好Markdown编辑器以后,在内容里面粘贴(粘贴刚_csdn转载别人的博客

电脑怎么通过ip地址进入linux系统,如何远程登陆已知IP地址的电脑?-程序员宅基地

文章浏览阅读2k次。大家糟糕,于我们的学习工作之中,远程登陆已经知IP地址的电脑也许会常常用到,今天小编便与大家讲解几种方法,区别windows系统与linux系统:一、windows系统这里重要是利用远程控制软件来构建,假如是局域网,系统自从带的远程桌面相连便路,假如是非局域网,常用的远程控制软件便路。1.局域网这里重要是利用远程控制软件来构建,假如是局域网,系统自从带的远程桌面相连便路,假如是非局域网,常用的远程..._通过ip进入linux系统

随便推点

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'jffa.QRTZ_TRIGGERS' doesn't exist_table 'uip_basics.qrtz_triggers’-程序员宅基地

文章浏览阅读7.8k次,点赞2次,收藏2次。场景:看过 人人 快速开发的都明白,这里面有很多qrtz_开头的11个表,这些表不是业务表,是定时任务的辅助表。情况是这样的,我在线下,利用的是人人这同一套代码,个人博客的表什么的都新建好了,线下测试也没有问题,上线的时候,抛出这一段错误:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'jffa.QRTZ_TR..._table 'uip_basics.qrtz_triggers’

Windows XP Server2003 Me 98 2000下载-程序员宅基地

文章浏览阅读369次。大量操作系统迅雷下载(不是BT) WindowsXP 家庭版不用多做解释了吧!WindowsXP原版ISOSN:KWXXK-KD43C-86JQV-6BM33-FBMXG点击下载:==============================ftp://down:[email protected]/system/winxp_home_cn.iso=====..._windows me 原版iso

pr 基本操作_pr基本操作-程序员宅基地

文章浏览阅读5.3k次,点赞2次,收藏16次。1、文件夹直接拖、项目面板双击,导入单个或者多个,或者文件夹;项目左下角,改变视图;项目右下脚,可新建文件夹管理(素材箱);导入图片时,选择是否分层,因为图片从ps编辑时,可能有多个图层;当分层导入时,会比图层数目多一个,是序列;导入序列帧:是以帧为单位的一系列图片,但是直接导入是图片,因此以序列帧格式导入,才能是视频; 导入时,选中第一个,根据命名,电脑会直接识别序列帧,勾选左下脚:“图像序列”;序列帧命名时, 注意位数;07、脱机008 文件序列的创建创建序列,项目右下角 序列_pr基本操作

ORACLE OC4J服务器不支持XFire webservices的解决方案-程序员宅基地

文章浏览阅读63次。为什么80%的码农都做不了架构师?>>> ..._oracle请求xfire内容缺失

JAVA环境变量的配置_"c:\\program files\\java\\jdk1.8.0_212\\bin\\java.-程序员宅基地

文章浏览阅读1.1k次。一:jdk安装版本——1.8.0_171step:默认开发工具,默认文件路劲二:jdk变量三个1_"c:\\program files\\java\\jdk1.8.0_212\\bin\\java.exe\" -xx:tieredstopatlevel=1 -n"

SynchronizedMap和ConcurrentHashMap有什么区别-程序员宅基地

文章浏览阅读734次。SynchronizedMap实现上在调用Map的所有方法是,对整个map进行了同步!public V put(K key, V value) { synchronized (mutex) {return m.put(key, value);}}ConcurrentHashMap的实现却更加精细,他对要操作的桶加锁,而不是整个加锁,所以ConcurrentHashMap在性能..._sequencedhashmap 和 concurrenthashmap 区别是什么

推荐文章

热门文章

相关标签