如何显示浮点数和实数类型的所有存储小数?

时间:2015-09-12 09:26:44

标签: sql sql-server

最近我在做一些关于固定精度和浮点类型的实验。我发现一个令人讨厌的是,我无法看到浮动和真实类型的所有数字。我尝试转换为十进制(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不能按预期工作?

3 个答案:

答案 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 } } REALapproximate numerics

  

用于浮点数字的近似数字数据类型   数据。浮点数据是近似值;因此,并非所有值   数据类型范围可以完全表示。 ISO的同义词   真实是浮动(24)

浮动:

  

float [(n)]

     

其中n是用于以科学计数形式存储浮点数的尾数的位数,因此,指示   精度和存储大小。如果指定了n,则它必须是值   介于1和53之间。 n的默认值为53

FLOATDECIMALexact 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它说;

  

计算机不能无限地直接存储任意实数   很多数字。

这就是为什么你得到这样的结果。