在大数据处理中,会遇到数据范围和数据精度的问题
数据范围的问题
考虑每种数据类型的最大值
数据精度问题
目前多是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=2147483647 共10位
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)