当前位置: 首页 > news >正文

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
}

 

  

 

转载于:https://www.cnblogs.com/mominger/p/7019496.html

相关文章:

  • OpenCV入门指南 人脸检测 haar分类器
  • MySQL主从延时这么长,要怎么优化?
  • 使用 NPOI 导出数据示例
  • WPF Browser 中如何获取当前路径(临时文件中)?
  • 10+优秀“分步引导”jQuery插件(转)
  • 用processing画李萨如曲线
  • MVC笔记 初识模型(二)
  • android 手机网络接入点名称及WAP、NET模式的区别
  • 金蝶osf接口开发_金蝶云·星辰 | ?小微企业服务成长平台
  • 小程序商店刷榜_怎么注册微信小程序商店
  • 中getname_【136期】你能谈谈Java中 synchronized 对象锁和类锁的区别
  • 加到service中无效_给 COLA 做减法:应用架构中的“弯弯绕设计”
  • set集合 结构体_Swift - 集合(Set)使用详解(附样例)
  • 前端动态获取servlet虚拟路径_Servlet 过滤器和异常处理
  • access中下划线是font_Python中的模块及扩展库
  • 【css3】浏览器内核及其兼容性
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • 230. Kth Smallest Element in a BST
  • 4. 路由到控制器 - Laravel从零开始教程
  • CSS 提示工具(Tooltip)
  • download使用浅析
  • flutter的key在widget list的作用以及必要性
  • Git初体验
  • golang 发送GET和POST示例
  • Js基础知识(四) - js运行原理与机制
  • KMP算法及优化
  • php中curl和soap方式请求服务超时问题
  • SpingCloudBus整合RabbitMQ
  • 前端攻城师
  • 删除表内多余的重复数据
  • 实现菜单下拉伸展折叠效果demo
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • #大学#套接字
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (区间dp) (经典例题) 石子合并
  • (生成器)yield与(迭代器)generator
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • *p++,*(p++),*++p,(*p)++区别?
  • .NET 8.0 发布到 IIS
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .Net mvc总结
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • ::前边啥也没有
  • @Autowired 与@Resource的区别
  • @ConfigurationProperties注解对数据的自动封装
  • [\u4e00-\u9fa5] //匹配中文字符
  • [20190401]关于semtimedop函数调用.txt
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [22]. 括号生成
  • [4.9福建四校联考]
  • [Angular] 笔记 18:Angular Router