最近我在做一些关于固定精度和浮点类型的实验。我发现一个令人讨厌的是,我无法看到浮动和真实类型的所有数字。我尝试转换为十进制(30,20),但这给了我小数位的小数(精度)。我的猜测是内部强制转换为实数浮动(53)然后转换为十进制(30,20)。我问自己这是如何运作的?
关注sql snippet (SqlFiddle)说明了问题:
DECLARE @r real, @f float
SET @r= 15.49
SET @f= 15.49
SELECT
@r AS 'Real',
CAST(@r as DECIMAL(30,20)) AS 'Real as Decimal',
@f AS 'Float',
CAST(@f as DECIMAL(30,20)) AS 'Float as Decimal';
这会产生以下结果:
Real Real as Decimal Float Float as Decimal
-----------------------------------------------------------
15.49 15.489999771118164 15.49 15.49
实际值@r显示为15.49。我猜因为它是在第7个精确数字上舍入的。虽然它不精确,但它被舍入到15.49。十进制显示令我困惑。为什么这么多小数?我想要实现的是获取存储在实际类型中的所有数字。 浮动值(我猜)足够精确,因此可以准确存储值15.49。 那么如何正确显示以real和float类型存储的所有数字?为什么强制转换为Decimal不能按预期工作?
答案 0 :(得分:2)
首先请看Data Types
“为什么这么多小数”
因为 android {
compileSdkVersion 21
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.example.app"
minSdkVersion 17
targetSdkVersion 22
}
signingConfigs {
release {
storeFile file("myfile.keystore")
storePassword "password"
keyAlias "alias"
keyPassword "password"
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
signingConfig signingConfigs.release
}
}
和REAL
是approximate numerics
用于浮点数字的近似数字数据类型 数据。浮点数据是近似值;因此,并非所有值 数据类型范围可以完全表示。 ISO的同义词 真实是浮动(24)。
浮动:
float [(n)]
其中n是用于以科学计数形式存储浮点数的尾数的位数,因此,指示 精度和存储大小。如果指定了n,则它必须是值 介于1和53之间。 n的默认值为53 。
FLOAT
和DECIMAL
为exact numbers:
具有固定精度和比例的数字数据类型。
您的代码相当于:
NUMERIC
因此,对于DECLARE
@r float(24) = 15.49, -- smaller precision so can't represent value exactly
@f float(53) = 15.49;
SELECT
@r AS 'Real',
CAST(@r as DECIMAL(30,20)) AS 'Real as Decimal',
@f AS 'Float',
CAST(@f as DECIMAL(30,20)) AS 'Float as Decimal';
,您可以按照要求的精度CAST到REAL
或使用DECIMAL
:
<强> SqlFiddle 强>
ROUND
更好地将您的数据存储为DECLARE @r real = 15.49;
SELECT
@r AS 'Real',
CAST(@r as DECIMAL(10,2)) AS 'Real as Decimal',
CAST(ROUND(@r, 2) as DECIMAL(30,20)) AS 'Real as Decimal Rounded'
答案 1 :(得分:0)
阅读此 Question
然后,
1&GT;的 float and real 强>
用于浮点数字的近似数字数据类型 数据。浮点数据是近似值;因此,并非所有的价值观 数据类型范围可以准确表示。 ISO的同义词 真实是浮动(24)。
所以,你只需要记住那个
浮点数据是近似值;因此,并非 中的所有值 数据类型范围可以准确表示
和
将使用科学记数法的浮点值转换为十进制或 numeric仅限于精度为17位的值。任何价值 精度高于17轮至零。
答案 2 :(得分:-1)
您无法存储具有axact值的REAL数字。这来自实数的定义。如果你看; https://en.wikipedia.org/wiki/Real_number它说;
计算机不能无限地直接存储任意实数 很多数字。
这就是为什么你得到这样的结果。