`
zizipo
  • 浏览: 22620 次
  • 性别: 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学习资料大全,很全很丰富

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

    matlab精度检验代码-programing-language-identify:构建一个程序以预测任何源代码的编程语言

    matlab精度检验代码编程语言预测 只要给我您的纯文本源代码即可。 我会猜你那段文字的编程语言 支持的编程语言列表: tsql python scala haskell perl swift c++ bash html css matlab shell php go c# c ruby asp...

    FAAST-tube-system:Makers Academy 第 1 周挑战 - 带有 Ruby、TDD 和 OOP 的伦敦地铁系统

    这是巩固我对 Ruby、Ruby 模块和 Rspec 测试(包括使用双精度)中面向对象编程的理解的重要挑战。 通过我的代码重构以及与教学人员的一对一交流,我了解到应该如何构建、测试和展示优秀的面向对象编程。 使用的技术...

    模型类方法实验室在线网络pt-081219

    使用活动记录的最佳查询学习目标使用ActiveRecord的AREL库来构建优化的查询介绍在编程中,一个很好的准则是: 使用最佳工具完成工作例如,您不想使用JavaScript来构建用于飞向月球的计算机。 JavaScript的十进制精度...

    模型类方法实验室v-000

    在编程中,一个很好的准则是: 使用最佳工具完成工作 例如,您不想使用JavaScript来构建用于飞向月球的计算机。 JavaScript的十进制精度不是很好,在距离月球很远的地方,在小数点后的十万分之一处得到一个数字,是...

    模型类方法实验室在线网络英尺090919

    在编程中,一个很好的准则是: 使用最佳工具完成工作 例如,您不想使用JavaScript来构建用于飞向月球的计算机。 JavaScript的十进制精度不是很好,在距离月球很远的地方,在小数点后的十万分之一处得到一个数字,是...

    模型类方法实验室SF网络091619

    在编程中,一个很好的准则是: 使用最佳工具完成工作 例如,您不想使用JavaScript来构建用于飞向月球的计算机。 JavaScript的十进制精度不是很好,在距离月球很远的地方,在小数点后的十万分之一处得到一个数字,是...

    模型类方法实验室在线网络-ft-061019

    在编程中,一个很好的准则是: 使用最佳工具完成工作 例如,您不想使用JavaScript来构建用于飞向月球的计算机。 JavaScript的十进制精度不是很好,在距离月球很远的地方,在小数点后的十万分之一处得到一个数字,是...

    finitio:Finitio是一种用于验证,强制和记录数据的语言

    -Ruby中的Finitio(验证和强制,0.xy版本) -Java语言中的Finitio(验证和强制,即将发布) 贡献 请加入以获取有关Finitio的问题和讨论。 我们还欢迎带有Cucumber功能的拉动请求,以演示用例并提出新功能! 如果...

    若干源程序资料12.rar

    2012-06-11 21:03 956,190 C++ Primer中文版(第4版)中的源代码.rar 2012-06-11 21:12 1,386,523 C++-打飞机的游戏.rar 2012-06-11 21:06 78,719 C++USB接口的鼠标驱动源程序.rar 2012-06-11 21:07 50,067 C++VC编写...

Global site tag (gtag.js) - Google Analytics