• 自动秒收录
  • 软件:1973
  • 资讯:57941|
  • 收录网站:279743|

IT精英团

SQL Server十进制类型(浮点和十进制)

SQL Server十进制类型(浮点和十进制)

浏览次数:
评论次数:
编辑: 景同
信息来源: ITPUB
更新日期: 2022-09-23 01:45:41
摘要

在SQLServer中,实际上小数数值只有两种数据类型:float和decimal,分别是近似数值和精确数值。其他小数类型,都可以使用float和decimal来替代,例如,双精度(doublep

  • 正文开始
  • 相关阅读
  • 推荐作品

在SQL Server中,小数值的数据类型实际上只有两种:float和decimal,分别是近似值和精确值。其他小数类型可以用float和decimal代替。例如,双精度数据类型相当于float(53),real相当于float(24),numeric是decimal的同义词。您应该避免在程序中直接使用双精度、实数和数字,而是使用float(24)、float(53)和decimal。

Float是近似值,缺乏精度;Decimal是一个精确的值,没有损失精度。当值不允许丢失精度时,使用decimal数据类型来存储数据。在计算小数的除法时,SQL Server隐式升级数据类型,根据小数值的数据类型转换为float(24)或float(53)附近。

一,近似数值

float表示一个近似值,精度有损失。数据类型是float(n),n是可选的。默认类型是float(53),占用8个字节。虽然n的取值范围是1-53,但实际上float只能表示float(53)和float(24)两种类型,分别占用8字节和4字节。

其中n是用科学的计数方法来存储浮点数的尾数的位数,所以决定了精度和存储大小。如果指定了n,它必须是1到53之间的值,n的默认值是53。

n

精确

存储大小

1-24

7位数

4字节

25-53

15位数

8字节

注意:SQL Server将n视为两个可能值之一。如果1=n=24,则认为n为24;如果25=n=53,则n视为53。近似值很难确定是否相等,所以要避免对float类型进行相等的比较,只比较or。

二,精确数值

decimal没有精度损失,数据类型decimal(p,s)需要分别指定最大小数位数(p)和小数位数(s):

p(精度):指定小数位数的最大值。小数点左右的位数总和不能超过P,P的取值范围是1到38,默认值是18。s(小数位数):指定小数点右边的小数位数,p-s是小数点左边的最大位数。s必须是从0到p的值,并且只有在指定了精度的情况下才能指定。s的默认值是0,因此,0=s=p。

精确

存储字节

1 - 9

10-19

20-28

13

29-38

17

p和s必须遵循规则:0=s=p=38,decimal(p,s)能表示的有效值是从-10 ^ 38 ^ 1到10 ^ 38-1。

decimal数据类型的最大精度是38,这意味着decimal数据类型最多可以存储38位数字,所有数字都可以位于小数点之后。Decimal数据类型存储精确的数字表示,没有近似值。

三,小

数的除法是近似计算

小数的除法是近似计算,必须把小数的类型提升为float类型。小数常量的默认数据类型是decimal,float的优先级比decimal高。

在Transact-SQL语句中,具有小数点的常量会自动转换为decimal,并使用必需的最小精度和小数位数。 例如,将常量12.345转换为小数类型,decimal(5,3),即精度为5,小数位为3。

在TSQL中,小数常量是decimal类型,如一下示例,TSQL把常量 1.0 自动转换为decimal(2,1),在计算除法时,TSQL自动把decimal转换位float类型。

declare @f_low float(24)
declare @f_high float(53)
select @f_low=cast(1.0 as float(24))/3,@f_high=cast(1.0 as float(53))/3
select 1.0/3 as f,@f_low as f_low, @f_high as f_high

declare @dec decimal(38,37)
declare @num decimal(38,37)

select @dec=cast(1.0 as decimal(38,37))/3,@num=cast(1.0 as decimal(38,37))
select @dec,@num,1.0/3,cast(1.0 as float(24))/3,1.000000000000/3,cast(1.0 as float(53))/3

默认情况下,SQL Server将小数常量作为decimal 数据类型,在计算小数的除法时,就近进行数据类型的升级,转换为float(24)或float(53) 数据类型。

在 Transact-SQL 语句中,小数数值的常量自动转换为 decimal 数据类型,在转换时,使用最小的精度和小数位数。例如,常量 12.345 被转换为 numeric 值,其精度为 5,小数位为 3。

In Transact-SQL statements, a constant with a decimal point is automatically converted into a numeric data value, using the minimum precision and scale necessary. For example, the constant 12.345 is converted into a numeric value with a precision of 5 and a scale of 3.

四,将小数转换成字符串(varchar)

相比cast(float_expression as float(24/53)),使用 str 函数能够有效控制近似数值的小数位数,函数str获取的是近视数值。

STR ( float_expression [ , length [ , decimal ] ] )
  • length是小数的总位数,包含正负符号,小数点,小数点左边和右边数字个数之和;
  • decimal是小数位的数量(小数点右边数字个数),小数位最大为16位,不能超过16,否则,会被截断为16位。如果小数位没有decimal多,那么右边补0。
  • 返回值是varchar类型。

1,对小数常量转换为varchar类型,减少小数位的数量,由2位减少为1位。

SELECT STR(123.45, 6, 1);

2,将decimal 变量转换为varchar类型

declare @d decimal(10,2)
set @d=123.45

SELECT STR(@d, 6, 1);

3,将 float 表达式的值转换为varchar 类型

1.0/3 默认转换为float(24) 类型,因此只有6位小数,小于decimal 参数的8位,右边补两个0。

SELECT STR(1.0/3, 10, 8);

4,在将float和decimal转换为varchar类型时,使用函数str或cast强制转换,返回的数值可能是不相同

declare @dt decimal(38,30)
declare @df float(53)

set @dt=50.8863983154297
set @df=50.8863983154297

select @df as df,@dt as dt,
str(@dt,38,30) as str_dt,str(@df,38,30) as str_df,
cast(@dt as varchar(100)) as var_dt,cast(@df as varchar(100)) as var_df

字段str_dt和str_df的值是不相同的,str函数首先对这两个小数数值取近似值,使用cast强制转换,对于decimal,返回的是精确值,对于float,返回的是近似值。

将SQL Server数据库迁移到Azure SQL
« 上一篇 2022-09-23
  • 将SQL Server数据库迁移到Azure SQL
    0阅读 0条评论 个赞
    最近有个维护的项目需要把SQLServer2012的数据库迁移到AzureSQL上去,迁移过程可谓一波三折,故在此分享这次迁移中碰到的点点滴滴,希望对朋友们有所帮助。AzureSQL……
  • 从0构建SQL Server AlwaysOn第3章(配置AlwaysOn)
    0阅读 0条评论 个赞
    第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnblogs.com/lyhabc/p/4682028.html第三篇htt……
  • VUE:引入腾讯地图 实现赛道动画
    0阅读 0条评论 个赞
    效果:引入步骤:在html中通过引入script标签加载API服务在一个盒子元素div中预先准备地图容器,并在CSS样式中定义地图(容器)显示大小创建并显示地图的代码创建动画和标记1.在……
  • 如何在分布式系统中实现对关键资源的互斥访问?
    0阅读 0条评论 个赞
    网络时代,购物、社交等之前只能在线下进行的活动,如今都可以在网络上完成。为了促进消费,电商网、网络店铺经常推出商品限定数量内的“秒杀”,“抢购”活动,类似的临界资源访问还有我们生活中常见的微信多人抢红……
  • Java SE 19的新特性
    0阅读 0条评论 个赞
    源码#源仓库:Github:java_new_features镜像仓库:GitCode:java_new_featuresHashMap新的构造方法#JavaSE19,构造哈希表的时候,由于有扩……
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
  • AQS:Java中悲观锁的底层实现机制
    0阅读 0条评论 个赞
    介绍AQSAQS(AbstractQueuedSynchronizer)是Java并发包中,实现各种同步组件的基础。比如各种锁:ReentrantLock、ReadWriteLock、Stamp……
  • spring项目中启动包的原理 以及自定义启动包的使用
    0阅读 0条评论 个赞
    MAVEN项目中starter的原理一.原始方式我们最早配置spring应用的时候,必须要经历的步骤:1.pom文件中引入相关的jar包,包括spring,redis,jdbc等等2.通过prope……
  • 自动化测试选择Python还是Java?
    0阅读 0条评论 个赞
    你好,我是测试蔡坨坨。今天,我们来聊一聊测试人员想要进阶,想要做自动化测试,甚至测试开发,如何选择编程语言。前言自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发展的趋势。……
  • SQL Server联接方式
    0阅读 0条评论 个赞
    0.参考文献MicrosoftSQLServer企业级平台管理实践看懂SqlServer查询计划1.测试数据准备参考:SqlServer中的表访问方式TableScan,IndexScan……
  • MySQL DDL执行模式-在线DDL简介
    0阅读 0条评论 个赞
    MySQLDDL执行方式-OnlineDDL介绍1引言大家好,今天与大家一起分享一下mysqlDDL执行方式。一般来说MySQL分为DDL(定义)和DML(操作)。DDL:DataDefi……
  • 谈谈动态线程池的9个场景(改进版)
    0阅读 0条评论 个赞
    大家好,我是小马哥。线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发以及大批量的任务处理场景,线程池的使用是必不可少的。……
  • 基于 网络6的轻量级Webapi框架紧固点
    0阅读 0条评论 个赞
    大家好,我是等天黑。FastEndpoints是一个基于.NET6开发的开源webapi框架,它可以很好地替代.NETMinimalAPIs和MVC,专门为开发效率而生,带来了全……
  • 简单分析下的GOLDENDB
    0阅读 0条评论 个赞
    GOLDENDB是金融行业使用的比较广泛的一个数据库产品,以前也经常有朋友希望我写几篇分析GoldenDB数据库的文章。说实在的这类文章不好写,必须对某个产品有一定程度的了解,特别是真正上手用过之后,……
  • 计算机网络-了解-DNS和HTTPDNS
    0阅读 0条评论 个赞
    DNS和HTTPDNSDNS域名解析的过程传统DNS存在的问题1、域名缓存问题2、域名转发问题3、出口NAT问题4、DNS域名更新问题5、解析延迟问题6、运营商劫持HTTPDNSHTTP……
  • 颤振| |理解什么是状态管理
    0阅读 0条评论 个赞
    目录1.什么是状态管理2.不同的状态管理分类3.Flutter中的有状态组件和无状态组件4.Flutter中有哪些可以做到状态管理5.为什么要使用状态管理6.常见的状态管理框架有哪些7.状态管理总结&……
  • 基于位置变化的市县弹出引导切换
    31阅读 0条评论 个赞
    目录1.背景2.模型方案产出3.总结01背景58App业务中有城市和县域两个首页,两者中间有一个过渡选择页,用户通过点击该页面下的条目内容可以切换到对应条目的首页;比如:点击“北京”会跳转到北京(市)……
  • Linux驱动开发十六 输入系统33543 系统附带的输入驱动程序
    0阅读 0条评论 个赞
    前面两章我们通过input子系统构建了一个按键类型的输入设备的驱动,其实Linux的内核还提供了一套基于GPIO的按键驱动程序,和LED设备一样,我们只需要在编译内核的过程中进行配置然后在设备树中定义……
  • 数据库发展史II-数据仓库
    6阅读 0条评论 个赞
    回顾数据仓库的发展历程,大致可以将其分为几个阶段:萌芽探索到全企业集成时代、企业数据集成时代、混乱时代--"数据仓库之父"间的论战、理论模型确认时代以及数据仓库产品百家争鸣时代。数据仓库理论发展历程上……
  • SpringMVC 03: 请求和响应的乱码解决 + SpringMVC响应Ajax请求
    1阅读 0条评论 个赞
    请求或响应的中文乱码问题tomcat9解决了get请求和响应的中文乱码问题,但是没有解决post请求或响应的中文乱码问题tomcat10解决了get和post请求以及响应的中文乱码问题考虑到实际项目中……
  • 记录在线超时的分析和故障排除过程
    2阅读 0条评论 个赞
    .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
  • 举例说明库伯内特公司的豆荚核心资源
    3阅读 0条评论 个赞
    目录一、Pod定义二、Pod入门yaml描述文件三、共享NetworkNamespace四、共享PID五、容器生命周期六、初始化容器6.1、简介6.2、与普通容器的区别6.3、实验七、Pod探针7.1……
  • [设计模式] Java设计模式-桥模式
    0阅读 0条评论 个赞
    目录【设计模式】Java设计模式-桥接模式简介桥接模式实例代码示例①、品牌接口②、汽车品牌③、抽象汽车类④、汽车类型子类⑤、桥接模式测试1|1简介桥接(Bridge)是用于把抽象化与实现化解耦,使……
  • Byzer使用SQL完成端到端的机器学习过程
    0阅读 0条评论 个赞
    直播简介内容简介:这次分享,我们将以Kaggle上的出租车行车时间预测问题为例,示范如何使用两个开源项目Byzer和OpenMLDB联合来打造一个完整的机器学习应用,涵盖湖仓数据加载,可视化,特……
  • 转:Java老了 科特林会取而代之吗?
    0阅读 0条评论 个赞
    .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
  • SQL Server十进制类型(浮点和十进制)
    0阅读 0条评论 个赞
    在SQLServer中,实际上小数数值只有两种数据类型:float和decimal,分别是近似数值和精确数值。其他小数类型,都可以使用float和decimal来替代,例如,双精度(doublep……
最近发布资讯
更多