`
zizipo
  • 浏览: 23125 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

ruby编程中精度问题的总结

 
阅读更多
  最近半年一直在开发一个跟金融相关的互联网应用,金融的计算要求严谨,数字相差一分钱也会给用户产生不够专业不值得信任的感觉。结合ruby编程语言,谈一下计算的精度问题。
引用
精确计算的前提,是区分数值是中间量还是输入输出量,输出量做为一个给用户看到的量,是有效力的,在四舍五入后得到量,只要是会被用户看到了解到的,在后面的计算中就应该做为一个精确量。

举例:A有1.01元,分给B,C,他们均只能拿到0.5元,B要再给D钱,就应该以0.5为依据,而不是0.505。
引用
所以计算的过程可以概括为:
输入量----》中间计算过程,误差在累积----》保留确定位数的小小数,输出----》输出作为精确输入量再次输入----》中间计算过程,误差累积---》.....
这个过程的重复。

要保证计算的精度,就是要保证中间计算过程中误差累积不要超过输出的精度要求。也就是说,中间计算过程不要积累太多的误差就OK了。
对于能精确到小数点后面q位的数据类型,误差最大为10^(q+1)*5,例如:只能精确2位小数数据类型,误差最大为0.005。设最大误差为p,误差的积累情况如下:
  • X1+X2+....+Xn的形式,最大误差<=n*p
  • X1*n,误差<=n*p
  • X1^n,误差<=n*p

上面都很容易证明。
下面的各种数据类型误差累积做一个简单分析。
1.IEEE浮点书,分为single,double,分别为32,64位,32位的进度为十进制小数点后6位,64位为14位,例如,对于32位的情况,如要球精度为2位小数,只要保证前面的计算情况下n<10000即可。ruby 中的float为64位IEEE浮点数。这种类型还会有10进制转化2进制的还有误差,如0.2就会有误差。
2.类似Bignum这样的类型,可以表示任意精度的整数,把这个思想运用到浮点数,能个解决进制转化带来的精度问题,还对于很多运算,还是有误差,比如1 / 3的情况,必然还是会产生3*10^(-n)的误差。ruby中的bigdecimal,整数部分精度是无限的,是一个Bignum,小数部分18位。
3.要解决2中有理数运算产生的误差问题,还可以使用rational类型,但这个对于如PMT这样的函数,会产生无理数的,还是会有误差。
还有一种自然尾损尾溢的情况,还是如上例,有1分钱不知道去哪里,这个不是计算精度的问题,因为大家有分来做资金结算的最小单位产生的自然的尾损问题。这种情况也是值得注意的。
0
0
分享到:
评论

相关推荐

    Ruby-Money一个Ruby库来处理货币和货币转换

    Ruby-Money库是一个专门为Ruby编程语言设计的强大工具,它专注于处理货币相关的运算和货币转换。这个库被广泛用于需要精确管理货币数据的应用程序,比如电子商务、财务系统或者任何涉及金融交易的项目。在Ruby社区中...

    教程资源ruby

    - **面向对象编程**:Ruby 中一切都是对象,支持类、继承、方法、单态方法、模块和迭代器等概念。 - **变量**:Ruby 不需要显式声明变量,且变量无类型。 - **异常处理**:Ruby 提供 `rescue` 和 `ensure` 关键字来...

    ruby学习资料大全,很全很丰富

    Ruby是"一种用于迅速和简便的面向对象编程的解释性脚本语言";这意味着什么? 解释性脚本语言: 有直接呼叫系统调用的能力 强大的字符串操作和正则表达式 开发中快速回馈 迅速和简便: 无需变量声明 变量无...

    RubyUsers'Guide

    本文将详细介绍Ruby编程语言及其核心概念,包括但不限于基础语法、面向对象思想、程序结构、异常处理以及Rails框架的集成。 1. Ruby语言简介 Ruby以其解释型脚本语言的特性而闻名,它允许开发者直接进行系统调用,...

    ruby技巧

    Ruby 是一种动态、面向对象的编程语言,以其简洁和优雅的语法著称。在 Ruby 中,程序员可以利用各种技巧来提高代码的可读性和效率。...通过不断实践和学习,你将能够熟练运用 Ruby 来解决各种编程问题。

    11.5 时间日期the ruby way.rar

    在Ruby编程语言中,时间日期处理是至关重要的,特别是在开发涉及日志记录、事件调度或数据分析的应用程序时。"11.5 时间日期the ruby way"这个主题深入探讨了Ruby中处理时间日期的最佳实践和常见用法。让我们逐一...

    ruby环境源码

    标题“ruby环境源码”指的是Ruby编程语言的源代码。源代码是程序的原始形式,程序员可以直接阅读、修改和编译。在Ruby的情况下,源代码通常以`.rb`为扩展名。这里的`ruby-2.4.5.tar.gz`是一个压缩文件,它包含了Ruby...

    旅行商问题遗传算法解决方案_ruby_代码_下载

    旅行商问题(Traveling Salesman Problem,TSP)是一个经典的组合优化问题...通过阅读和理解这些文件,你可以深入学习如何用Ruby实现遗传算法解决实际问题,同时也可以了解如何利用面向对象编程来组织复杂算法的实现。

    SlopeOne推荐算法的Ruby实现_Ruby_下载.zip

    在Ruby编程语言中实现SlopeOne算法,可以方便地集成到各种Web应用或服务中,为用户提供个性化的商品或内容推荐。 一、SlopeOne算法简介 1. 基本原理:SlopeOne算法基于用户对物品的评分差异进行预测。对于用户u和...

    欧拉公式求圆周率的matlab代码-Project-Euler-Ruby:用Ruby编程语言编写的针对Euler项目的解决方案

    可能在该项目中,开发者使用Ruby解决了一些Project Euler问题,其中包括可能利用不同的算法计算π。不过,具体实现细节需要查看压缩包内的源代码才能得知。 总的来说,欧拉公式是连接e、i和π的桥梁,但在MATLAB中...

    ruby基础教程(第四版)第12章 数值类1

    在Ruby编程语言中,数值类`Numeric`是一个基础且重要的概念,它包含了处理各种数值类型的方法和特性。本章主要探讨了`Numeric`类的四个子类:`Integer`、`Float`、`Rational`和`Complex`。 1. **Integer** 类:Ruby...

    sketchup-rubyscript-tutorials:Google SketchUp 的 Ruby 脚本教程。 对于那些渴望创建一些常规计算几何的人。 并学习Ruby。 也许也学习编程

    在"Sketchup-rubyscript-tutorials"中,你会发现一系列的教程,它们旨在帮助你从零开始学习SketchUp的Ruby编程。这些教程可能涵盖以下几个方面: 1. **基础概念**:介绍Ruby的基本语法,如变量、数据类型、控制结构...

    ruby-sphere-开源

    Ruby-Sphere是一个基于Ruby编程语言的开源项目,它致力于为天文学爱好者和专业人士提供一个便捷的工具,用于计算恒星的视在位置。这个库不仅包含了核心的数学算法,还可能包含用户界面部分,以帮助用户直观地进行...

    rubyinstaller-2.4.1-1-x64 windows

    2. **浮点数精度**: Ruby 2.4.1改进了浮点数的精度,尤其是在进行比较运算时,减少了因浮点数不精确导致的错误。 3. **Symbol to_proc**: 这个版本增强了`Symbol#to_proc`的性能,使得在使用块操作时能更快速地执行...

    ruby学习笔记

    根据提供的“ruby学习笔记”内容,我们可以从中提炼出多个重要的Ruby编程知识点,这些知识点对于初学者来说非常有用。下面将对这些知识点进行详细的解释与扩展。 ### 一、Ruby中的全局变量 Ruby提供了多个特殊变量...

    Ruby中Time对象的常用函数总结

    在Ruby编程语言中,`Time`对象是一个非常重要的类,用于处理日期和时间相关的操作。本文将详细介绍`Time`对象的一些常见且实用的方法和函数,帮助开发者更好地理解和应用这些功能。 #### 1. `Time.at` - **语法**:...

    ruby语言基础教程.pptx(共17页,携程内部培训版)

    - **内建类**: Ruby中内置了5个表示数字的类,另外还有3个在标准库中的数值类。 - **Numeric类**: 所有数字对象的基类。 - **Integer类**: 整数的实例。 - **Fixnum类**: 表示小范围内的整数,通常为31位。 - *...

    everydaythings:将“Exploring Everyday Things with R and Ruby”一书中的编程示例重写为 Julia

    《探索日常生活中的编程:以R和Ruby为例》是一本旨在教授如何使用编程解决日常问题的书籍,而"everydaythings"项目则是将该书中的示例代码迁移到Julia编程语言的一个实践尝试。Julia是一种高性能、动态类型的编程...

    RubyTapas:我在Ruby Tapas库中的工作

    在这个库中,你可以找到一系列关于Ruby编程的知识点,下面我们将逐一探讨。 1. **二进制文字** (Binary literals): 在Ruby中,二进制文字以`b`开头,用于表示二进制数据。例如,`b'1010'`就是一个二进制字符串,常...

    推荐系统的协同过滤_Ruby_Shell_下载.zip

    推荐系统是一种广泛应用于电商、音乐流媒体、视频分享等领域的个性化信息推送技术,它通过...通过深入学习和实践这个项目,你不仅可以掌握推荐系统的基础知识,还能提升编程技能,尤其是Ruby和Shell脚本的应用能力。

Global site tag (gtag.js) - Google Analytics