不同语言Decimal-数据值范围和精度

在大数据处理中,会遇到数据范围和数据精度的问题
数据范围的问题
    考虑每种数据类型的最大值
数据精度问题
    目前多是64位双精度标注--在金融和会计领域,关于货币的
    有可能是要保证高精度,超出64位双精度的标准,这个时候要注意

Java中

java.math.BigInteger
java.math.BigDecimal
        操作:  add  substract  multiply  divide  remainder
      数据类型转换: toString()  doubleValue  floatValue  longValue  intValue

Scala 中

scala.math.BigInt
scala.math.BigDecimal
BigInt
BigDecimal   
    object BigDecimal extends scala.AnyRef with scala.Serializable {
    在金融等货币情况,注意是否要用 BigDecimal,看Double 是精度够不够的的
scala.Int.maxValue=214748364710位
scala.Long.MaxValue
//当数据比较大的时候,使用Int和long会超出其范围-所以使用Double
  def choose(n: Int, k: Int): Double ={
    var cnk:Double=1.0
    if (k != 0 && k != n) {
      var ank=1d
      var ak1=1d
      for(i<- (n-k+1)to n){
        ank*=i
      }
      for(j<- 1 to k){
        ak1*=j
      }
      cnk=(ank/ak1)
    }
    cnk
  }

Python中

# IEEE二进制浮点数算术标准(IEEE 754) 15位数的相对精度(64位电脑)
Decimal 模块为浮点数提供了 任意精确度的对象
                                   以及 使用这些数值时处理精度问题的选项
#! /usr/bin/python
# -*- coding:utf-8 -*-
import decimal

# 通用十进制计算规范
x = decimal.Decimal('13.4')
y = decimal.Decimal('24.5')
z = decimal.Decimal((1,(3,7,2,3,4,6),-3))
z3 = decimal.Decimal((0,(3,7,2,3,4,6),-3))
print(z)
print(z3)   
try:
   print(x * y)
   print(x/y)
except decimal.DivisionByZero:
    print("Division by zero")

# 只改变某个语句块的精度 precision 有效数字
with decimal.localcontext(decimal.Context(prec=10)):
    print(x * y)
    print(x/y)

# 改变精度并执行
decimal.getcontext().prec=3
print(x*y)
print(x/y)

R语言中

numeric()  --double()
                  integer()

SQL

HiveSQL   decimal
        decimal(P,D) precision,
        decimal(10,2)
    BigInt  --Deciaml(38,0)

blogroll

social