golang 浮点数 取精度的效率对比
需求
浮点数取2位精度输出
实现
代码
package main import (
"time"
"log"
"strconv"
"fmt"
) func main() {
threadCount := 100000
fa := 3.233667 time1 := TestFn(threadCount,fa,func(fa float64) string{
return strconv.FormatFloat(fa,'f',2,64)
})
log.Printf("FormatFloat 耗时:%.4f ms",time1) time2 := TestFn(threadCount,fa,func(fa float64) string{
return fmt.Sprintf("%.2f",fa)
})
log.Printf("Sprintf 耗时:%.4f ms",time2) } func TestFn(count int,fa float64,fn func(fa float64) string) float64{
t1 := time.Now() for i := 0; i < count; i++ {
fn(fa)
} t2 := time.Now()
return t2.Sub(t1).Seconds()*1000
}
效率对比
测试 100次 (即threadCount赋值100,下面同理)
2017/06/15 18:50:17 FormatFloat 耗时:0.0452 ms
2017/06/15 18:50:17 Sprintf 耗时:0.0512 ms
测试 1000次
2017/06/15 18:50:43 FormatFloat 耗时:0.3861 ms
2017/06/15 18:50:43 Sprintf 耗时:0.4903 ms
测试 10000次
2017/06/15 18:50:58 FormatFloat 耗时:3.9688 ms
2017/06/15 18:50:58 Sprintf 耗时:5.2045 ms
测试 100000次
2017/06/15 18:51:20 FormatFloat 耗时:41.9253 ms
2017/06/15 18:51:20 Sprintf 耗时:51.8639 ms
测试 10000000次
2017/06/15 18:51:49 FormatFloat 耗时:3917.7585 ms
2017/06/15 18:51:54 Sprintf 耗时:5131.5497 ms
结论
strconv下的FormatFloat明显快一些。fmt.Sprintf用到反射,效率不高,建议少用。
注意
golang下的浮点数存在2个问题:
1,运算时,计算结果不准
2,四舍五入时,用的是银行舍入法,和其他语言四舍五入的值对不上
解决
//四舍五入 取精度
func ToFixed(f float64,places int) float64{
shift := math.Pow(10, float64(places))
fv := 0.0000000001 + f //对浮点数产生.xxx999999999 计算不准进行处理
return math.Floor(fv * shift + .5) / shift
}
golang 浮点数 取精度的效率对比的更多相关文章
- Java 中的浮点数取精度方法
Java 中的浮点数取精度方法 一.内容 一般在Java代码中取一个double类型的浮点数的精度,四舍五入或者直接舍去等的方式,使用了4种方法,推荐使用第一种,我已经封装成工具类了. 二.代码实现 ...
- 使用file_get_contents()和curl()抓取网络资源的效率对比
使用file_get_contents()和curl()抓取网络资源的效率对比 在将小程序用户头像合成海报的时候,用到了抓取用户头像对应的网络资源,那么抓取方式有很多,比如 file_get_cont ...
- FileInputStream 与 BufferedInputStream 效率对比
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3550158.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...
- SIMD---SSE系列及效率对比
SSE(即Streaming SIMD Extension),是对由MMX指令集引进的SIMD模型的扩展.我们知道MMX有两个明显的缺点: 只能操作整数. 不能与浮点数同时运行(MMX使用FPU寄存器 ...
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- jmeter 中 浮点数计算精度问题
jmeter 中 浮点数计算精度问题解决方法: 编写 beanshell 时使用 java.math.BigDecimal 方法构造,使用 BigDecimal 并且一定要用 String 来够造. ...
- 如何避开JavaScript浮点数计算精度问题(如0.1+0.2!==0.3)
不知道大家在使用JS的过程中有没有发现某些浮点数运算的时候,得到的结果存在精度问题:比如0.1 + 0.2 = 0.30000000000000004以及7 * 0.8 = 5.60000000000 ...
- js中如何取精度
js中如何取精度 一.总结 一句话总结:其实round()函数去经度会有误差,直接用num.toFixed(2)简单方便. toFixed()方法会按照指定的小数返回数值的字符串表示.var num ...
- List集合去重方式及效率对比
List集合相信大家在开发过程中几乎都会用到.有时候难免会遇到集合里的数据是重复的,需要进行去除.然而,去重方式有好几种方式,你用的是哪种方式呢?去重方式效率是否是最高效.最优的呢?今天就给大家讲解一 ...
随机推荐
- Git操作指南
请访问以下网址,很详细,今天偷个懒记录一下,之后有时间再来补全吧! https://git-scm.com/book/zh/v2
- 今天开始上Linux运维课。
2017年4月25日,北京.沙河老男孩教育,Linux运维. 我是其中一员,希望顺利!
- CodeSmith生成实体的分页读取规则
首先.我得向咱们博客园提个意见,能不能我写的东西就给预保存下呢?刚才我写半天,只因为这个不给力的IE浏览器死了,导致我白写了,如果这要是那个大神直接在这上面写的非常有技术含量的贴着会因此而丢失实在是有 ...
- PHP填补数字前后的0
PHP数字填补0 经常会遇到这样的问题: 自然数字是0,1,2,3...而我们需要的却是满足多少多少位数的数字,如:001,002. 在ID,编号,学号中我们会经常用到补全前面或者后面的空位(一般为前 ...
- time元素定义的格式
time元素表示的是24小时中的某一个时刻或日期,表示时间时允许时差. time元素定义的格式如下: <time datetime="2016-6-15">2016年6 ...
- 【转】10 条提升 Android 性能的建议
每个人都知道一个 App 的成功,与这个 App 的性能体验有着很密切的关系.但是如何让你的 App 拥有极致性能体验呢?在 DroidCon NYC 2015 的这个分享里,Boris Farber ...
- 微信公众号开发笔记2(nodejs)
本篇主要记录调用微信各种api和功能实现 一.始于access_token 无论调用微信的什么api,都需要一个查询参数,就是我们每隔1小时或者2小时获取的access_token,笔记1中已经保证了 ...
- OC中@class的使用
作用: 可以简单地引用一个类简单使用@class Dog; //类的引入 #import "Dog.h"仅仅是告诉编译器:Dog是一个类;并不会包含Dog这个类的所有内容 具体使用 ...
- Mqtt服务器搭建
.bg { background: #99CC99 } Mqtt服务器搭建 测试环境:CentOS64位 1.安装基础软件 yum install gcc-c++ yum install cmake ...
- 初次使用git配置以及git如何使用ssh密钥(将ssh密钥添加到github)
初次安装git配置用户名和邮箱 初次安装git需要配置用户名和邮箱,否则git会提示:please tell me who you are. 你需要运行命令来配置你的用户名和邮箱: $ git con ...