Sprintf

四舍六入:

 value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 9.824), 64)fmt.Println(value) //9.82value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 9.826), 64)fmt.Println(value) //9.83

第三位为5且5之后有有效数字,满足五入:

 value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 9.8251), 64)fmt.Println(value) //9.83value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 9.8351), 64)fmt.Println(value) //9.84

第三位为5且5之后没有有效数字:
网上有人说,第二位为奇数则进位,第二位为偶数则舍去,例如:

 value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 9.825), 64)fmt.Println(value) //9.82value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 9.835), 64)fmt.Println(value) //9.84

但是:

 value, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", 9.815), 64)fmt.Println(value) //9.81 居然舍去了value, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", 9.845), 64)fmt.Println(value) //9.85 居然进位了

所以,如果想满足正常的四舍五入逻辑,最好不要使用Sprintf处理。

math.Trunc

 fmt.Println(math.Trunc(9.815*1e2+0.5)*1e-2) //9.82fmt.Println(math.Trunc(9.825*1e2+0.5)*1e-2) //9.83fmt.Println(math.Trunc(9.835*1e2+0.5)*1e-2) //9.84fmt.Println(math.Trunc(9.845*1e2+0.5)*1e-2) //9.85

以上结果显示符合四舍五入,但是偶尔会出现精度问题:

 fmt.Println(math.Trunc(3.3*1e2+0.5)*1e-2) //3.3000000000000003fmt.Println(math.Trunc(3.3000000000000003*1e2+0.5) * 1e-2) //3.3000000000000003

同样使用Trunc,稍作调整:(此方案被大家提醒后发现确实存在问题,文末有修改方案

 n10 := math.Pow10(2)fmt.Println(math.Trunc((9.815+0.5/n10)*n10) / n10) //9.82fmt.Println(math.Trunc((9.825+0.5/n10)*n10) / n10) //9.83fmt.Println(math.Trunc((9.835+0.5/n10)*n10) / n10) //9.84fmt.Println(math.Trunc((9.845+0.5/n10)*n10) / n10) //9.85fmt.Println(math.Trunc((3.3+0.5/n10)*n10) / n10) //3.3fmt.Println(math.Trunc((3.3000000000000003+0.5/n10)*n10) / n10) //3.3

符合四舍五入规则。

如果要固定显示两位小数,需转换为string类型,前提是传入的数值,已经做过两位小数处理,否则依旧有进位问题:

 value := strconv.FormatFloat(3, 'f', 2, 64)fmt.Println(value) //3.00value = strconv.FormatFloat(3.3, 'f', 2, 64)fmt.Println(value) //3.30value = strconv.FormatFloat(9.815, 'f', 2, 64)fmt.Println(value) //9.81 被舍去value = strconv.FormatFloat(9.82, 'f', 2, 64)fmt.Println(value) //9.82

内容修改

错误示例:

n10 := math.Pow10(2)
fmt.Println(math.Trunc((129.975+0.5/n10)*n10) / n10) // 129.97
fmt.Println(math.Trunc((34423.125+0.5/n10)*n10) / n10) // 34423.12

代码修改:

package mainimport ("fmt""github.com/shopspring/decimal"
)func main() {v1, _ := decimal.NewFromFloat(9.824).Round(2).Float64()v2, _ := decimal.NewFromFloat(9.826).Round(2).Float64()v3, _ := decimal.NewFromFloat(9.8251).Round(2).Float64()fmt.Println(v1, v2, v3)v4, _ := decimal.NewFromFloat(9.815).Round(2).Float64()v5, _ := decimal.NewFromFloat(9.825).Round(2).Float64()v6, _ := decimal.NewFromFloat(9.835).Round(2).Float64()v7, _ := decimal.NewFromFloat(9.845).Round(2).Float64()fmt.Println(v4, v5, v6, v7)v8, _ := decimal.NewFromFloat(3.3).Round(2).Float64()v9, _ := decimal.NewFromFloat(3.3000000000000003).Round(2).Float64()v10, _ := decimal.NewFromFloat(3).Round(2).Float64()fmt.Println(v8, v9, v10)v11, _ := decimal.NewFromFloat(129.975).Round(2).Float64()v12, _ := decimal.NewFromFloat(34423.125).Round(2).Float64()fmt.Println(v11, v12)
}

结果如下:

9.82 9.83 9.83
9.82 9.83 9.84 9.85
3.3 3.3 3
129.98 34423.13

公众号:李田路口

Golang四舍五入保留两位小数相关推荐

  1. c++ 四舍五入保留两位小数_Excel中保留小数点位数

    今天老板让我把带有小数点的表格进行整理,老板说把数据整理成保留两位,默认为四舍五入,老板还要整理成一种不四舍五入的数据.好的老板马上整理,这次老板的要求正好是我会的,真棒!我们一起来学一下吧. 首先我 ...

  2. JavaScript计算两个文本框内数据的乘积(四舍五入保留两位小数)

    function check(id) { var re = /^[0-9]+.?[0-9]*$/; //判断数字是否合法的正则表达式 var danjia=document.getElementByI ...

  3. 【PAT甲级 ArrayList存放class】1011 World Cup Betting (20 分) Java版 3/3通过 四舍五入保留两位小数

    题目 一共给9个数,3*3,找到每行最大,按照题目要求套算式,计算就行 坑 & 心得 没啥坑,一次通过,用到的知识点是:自定义排序.四舍五入保留两位小数 DecimalFormat df = ...

  4. 求以下double数组的平均值(四舍五入保留两位小数):

    import java.math.BigDecimal;/*** 求以下double数组的平均值(四舍五入保留两位小数):* double[] arr = {0.1,0.2,2.1,3.2,5.56, ...

  5. 19-6/24作业: 将一个double类型的小数,按照四舍五入保留两位小数

    ☞要求 将一个double类型的小数,按照四舍五入保留两位小数 ☞实现方式 1.获得一个double类型的小数 2.使用BigDecimal包的setScale进行操作 3.输出结果 ☞代码内容 pa ...

  6. java float四舍五入保留两位小数_java基础入门-float四舍五入保留两位小数注意的地方...

    float四舍五入保留两位小数注意的地方 最近在codewars做了一道非常简单的题目,但是它却花了我20来分钟,虽然最后解决了,但是中间发觉对于java的基础实在不行,回去要好好补一下 不说这么多, ...

  7. JS 四舍五入保留两位小数

    Html 四舍五入保留两位小数: Html: <input type="number" step=".01" id="amount" ...

  8. C#不四舍五入保留两位小数

    /// <summary>/// 不四舍五入保留两位小数/// </summary>/// <param name="money"></p ...

  9. 利用Python3四舍五入保留两位小数

    说明:利用Python3四舍五入保留两位小数,曾踩过的坑分享给大家,希望能够共勉! 坑1:字符串格式化 a = 1.234        print("%.2f" % a)  # ...

最新文章

  1. postgresql创建只读账号
  2. layui 传递前端请求_Layui数据表格 前后端json数据接收的方法
  3. Please make sure you have the correct access rights and the repository exists
  4. 总结: C++ 中如何把输出结果写入到文件中
  5. Java个人财务管理小软件
  6. 抖音无水印视频批量下载助手
  7. hive查询数据库总条数
  8. Containerd 错误报错解决Failed to start containerd container runtime.
  9. php踩过的那些坑(2) strpos引发的血案
  10. 【IDEA 教程系列第 27 篇】idea 显示最近编辑的文件列表
  11. 为什么没有人投资 Livid 的 V2EX.com ?
  12. 使用 Wall 搭建个人照片墙和视频墙
  13. 线上线下联动 亚琦集团打好商贸物流体系创新“组合拳”
  14. 超级玛丽3号max即将停售70版本,到底保障如何,值不值得购买呢
  15. IBM developerWorks linux 技术论坛
  16. python 疯狂讲义 笔记(变量和基本类型)
  17. 2021-2025年中国脱水泵行业市场供需与战略研究报告
  18. python多分支结构案例_python的程序控制结构-分支结构与身体质量指数案例--python-6-da...
  19. 【Python学习笔记(一)—— 初识Python】
  20. 干货 | 滴滴 数据分析原来是这样做的!

热门文章

  1. 车联网上云最佳实践 七
  2. TEZ和MR简要区别
  3. Linux perm
  4. git bash shell 脚本 :从文件获取git仓库列表 git clone所有仓库
  5. LaTeX排版心形段落
  6. 50个js小项目-DAY1-expanding cards
  7. libusb使用指南
  8. 关于谢尔宾斯基三角(Sierpinski)的讲解
  9. java 进程假死原因_分析java进程假死状况
  10. 北京云端微服科技2017笔试题