Golang四舍五入保留两位小数
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四舍五入保留两位小数相关推荐
- c++ 四舍五入保留两位小数_Excel中保留小数点位数
今天老板让我把带有小数点的表格进行整理,老板说把数据整理成保留两位,默认为四舍五入,老板还要整理成一种不四舍五入的数据.好的老板马上整理,这次老板的要求正好是我会的,真棒!我们一起来学一下吧. 首先我 ...
- JavaScript计算两个文本框内数据的乘积(四舍五入保留两位小数)
function check(id) { var re = /^[0-9]+.?[0-9]*$/; //判断数字是否合法的正则表达式 var danjia=document.getElementByI ...
- 【PAT甲级 ArrayList存放class】1011 World Cup Betting (20 分) Java版 3/3通过 四舍五入保留两位小数
题目 一共给9个数,3*3,找到每行最大,按照题目要求套算式,计算就行 坑 & 心得 没啥坑,一次通过,用到的知识点是:自定义排序.四舍五入保留两位小数 DecimalFormat df = ...
- 求以下double数组的平均值(四舍五入保留两位小数):
import java.math.BigDecimal;/*** 求以下double数组的平均值(四舍五入保留两位小数):* double[] arr = {0.1,0.2,2.1,3.2,5.56, ...
- 19-6/24作业: 将一个double类型的小数,按照四舍五入保留两位小数
☞要求 将一个double类型的小数,按照四舍五入保留两位小数 ☞实现方式 1.获得一个double类型的小数 2.使用BigDecimal包的setScale进行操作 3.输出结果 ☞代码内容 pa ...
- java float四舍五入保留两位小数_java基础入门-float四舍五入保留两位小数注意的地方...
float四舍五入保留两位小数注意的地方 最近在codewars做了一道非常简单的题目,但是它却花了我20来分钟,虽然最后解决了,但是中间发觉对于java的基础实在不行,回去要好好补一下 不说这么多, ...
- JS 四舍五入保留两位小数
Html 四舍五入保留两位小数: Html: <input type="number" step=".01" id="amount" ...
- C#不四舍五入保留两位小数
/// <summary>/// 不四舍五入保留两位小数/// </summary>/// <param name="money"></p ...
- 利用Python3四舍五入保留两位小数
说明:利用Python3四舍五入保留两位小数,曾踩过的坑分享给大家,希望能够共勉! 坑1:字符串格式化 a = 1.234 print("%.2f" % a) # ...
最新文章
- postgresql创建只读账号
- layui 传递前端请求_Layui数据表格 前后端json数据接收的方法
- Please make sure you have the correct access rights and the repository exists
- 总结: C++ 中如何把输出结果写入到文件中
- Java个人财务管理小软件
- 抖音无水印视频批量下载助手
- hive查询数据库总条数
- Containerd 错误报错解决Failed to start containerd container runtime.
- php踩过的那些坑(2) strpos引发的血案
- 【IDEA 教程系列第 27 篇】idea 显示最近编辑的文件列表
- 为什么没有人投资 Livid 的 V2EX.com ?
- 使用 Wall 搭建个人照片墙和视频墙
- 线上线下联动 亚琦集团打好商贸物流体系创新“组合拳”
- 超级玛丽3号max即将停售70版本,到底保障如何,值不值得购买呢
- IBM developerWorks linux 技术论坛
- python 疯狂讲义 笔记(变量和基本类型)
- 2021-2025年中国脱水泵行业市场供需与战略研究报告
- python多分支结构案例_python的程序控制结构-分支结构与身体质量指数案例--python-6-da...
- 【Python学习笔记(一)—— 初识Python】
- 干货 | 滴滴 数据分析原来是这样做的!