SQL 中数值型数据截取及四舍五入

例一:

-- 将两个数值分别截取只保留两位小数 ( 注意此时字段默认为 decimal )

select CAST ( 10.097 as decimal ( 10, 2))   as [10.097 截取前 ]

,    CAST ( 10.094 as decimal ( 10, 2))   as [10.094 截取前 ]

,    CAST ( 10.145 as decimal ( 10, 2))   as [10.145 截取前 ]

例二:

-- 再次将两个数值分别截取只保留两位小数 ( 注意此时字段类型为 float )

declare @a float , @b float , @c float

set @a = 10.097

set @b = 10.094

set @c = 10.145

select CAST ( @a as decimal ( 10, 2))   as [10.097 截取前 ]

,    CAST ( @b as decimal ( 10, 2))   as [10.094 截取前 ]

,    CAST ( @c as decimal ( 10, 2))   as [10.145 截取前 ]

在做精度和小数位数的转换时 ,也要考虑 decimal 和 float 的不同类型字段的区别 。

否则用 Round 函数也是一样的效果 。

比如 :

declare @a float , @b float , @c float

set @a = 10.097

set @b = 10.094

set @c = 10.145

select ROUND ( @a   , 2)   as [10.097 进位前 ]

,    ROUND ( @b   , 2)   as [10.094 进位前 ]

,    ROUND ( @c , 2)   as [10.145 进位前 ]

--result:

10.097 进位前              10.094 进位前              10.145 进位前

---------------------- ---------------------- ----------------------

10.1                   10.09                  10.14

( 1 行受影响 )

总结 :当字段类型为 float 时 ,进行四舍五入有时会有奇怪的结果产生 ,比如

declare @a float , @b float , @c float

set @a = 0.134

set @b = 0.145

set @c = 0.146

select ROUND ( @a   , 2)   as [0.134 进位前 ]

,    ROUND ( @b   , 2)   as [0.145 进位前 ]

,    ROUND ( @c , 2)   as [0.146 进位前 ]

--result:

0.134 进位前               0.145 进位前               0.146 进位前

---------------------- ---------------------- ----------------------

0.13                   0.14                     0.15

( 1 行受影响 )

当字段类型为 decimal 时 ,对于高精度的小数位四舍五入时 ,并没有产生那样奇怪的结果 。比如 :

declare @a decimal ( 5, 3) , @b decimal ( 5, 3) , @c decimal ( 5, 3)

set @a = 0.134

set @b = 0.145

set @c = 0.146

select ROUND ( @a   , 2)   as [0.134 进位前 ]

,    ROUND ( @b   , 2)   as [0.145 进位前 ]

,    ROUND ( @c , 2)   as [0.146 进位前 ]

--result:

0.134 进位前               0.145 进位前               0.146 进位前

---------------------- ---------------------- ----------------------

0.130                    0.150                     0.150

( 1 行受影响 )

所以我们在进行小数位的计算或转换时 ,我会优先考虑 decimal 类型的数值 。比如 在例一中默认的字段类型即是 decimal ,下面我们来看一下:

--1 、将 0.145 导入临时表

select 0.145 a

into #a

( 1 行受影响 )

-- 查看临时表中 a 字段类型

select

[ 表名 ] = c . Name ,

[ 列名 ] = a . Name ,

[ 标识 ] = case when is_identity = 1 then '√' else '' end ,

[ 类型 ] = b . Name

from

sys . columns a

left join

sys . types b on a . user_type_id = b . user_type_id

inner join

sys . objects c on a . object_id = c . object_id

where left( c . Name , 2)= '#a' and a . name = 'a'

-- 结果如下图示:

所以回看例一 ,在进行数据转换时 ,默认的字段类型仍是 decimal 。

附图 数据类型转换时的行为规范

SQL 中数值型数据截取以及四舍五入的更多相关文章

  1. SQL 中的LastIndexOf,截取最后一次出现字符后面的字符(转)

    SQL如何取出一个字符串中最后一个特殊字符右边的字符,例如:10*20*300,怎样得到300? 使用reverse配合charindex来实现. reverse是把字符串倒置,然后通过charind ...

  2. sql中从指定位置截取指定长度字符串

    1. 字符串函数应用 --从指定索引截取指定长度的字符串 ,) --获取字符串中指定字符的索引(从1开始) select charindex(',','ab,cdefg') --实际应用中的语句 , ...

  3. sql server 数值的四舍五入

    sql中的四舍五入通常会有round  和cast( …… as decimal())两种方式: 个人建议使用cast  方式: 方式1: 经过试验,同样都可以做到四舍五入,但round如下实例1会报 ...

  4. SQL零星技术点:SQL中转换money类型数值转换为字符串问题

    --SQL中转换money类型数值转换为字符串问题,直接转换就转为两位了,所以需要做一下处理.具体请看下述sql实例. 1 create table #test(price money) insert ...

  5. 获取数值型数组中大于60的元素个数,给数值型数组中不足60分的加20分。(数组,for循环,if条件判断语句)

    package com.Summer_0420.cn; /** * @author Summer * 获取数值型数组中大于60的元素个数 * 给数值型数组中不足60分的加20分 */ public c ...

  6. SQL中字符串截取、连接、替换等函数的用法

    一.SQL中SUBSTRING函数的用法1.功能:返回字符.二进制.文本或图像表达式的一部分2.语法:SUBSTRING ( expression, start, length )3.QL 中的 su ...

  7. sql中的字符串匹配、函数大全

    假设你想建立一个与Yahoo功能相似的Internet目录.你可以建立一个表用来保存一系列的站点名称,统一资源定位器(URL),描述,和类别,并答应访问者通过在HTML form中输入要害字来检索这些 ...

  8. sql中的函数

    函数类别 作用 聚合函数 执行的操作是将多个值合并为一个值.例如 COUNT.SUM.MIN 和 MAX. 配置函数 是一种标量函数,可返回有关配置设置的信息. 转换函数 将值从一种数据类型转换为另一 ...

  9. SQL中Round(),Floor(),Ceiling()函数的浅析

    项目中的一个功能模块上用到了标量值函数,函数中又有ceiling()函数的用法,自己找了一些资料,对SQL中这几个函数做一个简单的记录,方便自己学习.有不足之处欢迎拍砖补充 1.round()函数遵循 ...

随机推荐

  1. UML用例图总结

    用例图主要用来描述“用户.需求.系统功能单元”之间的关系.它展示了一个外部用户能够观察到的系统功能模型图. [用途]:帮助开发团队以一种可视化的方式理解系统的功能需求. 用例图所包含的元素如下: 1. ...

  2. 转:Java NIO系列教程(二) Channel

    Java NIO的通道类似流,但又有些不同: 既可以从通道中读取数据,又可以写数据到通道.但流的读写通常是单向的. 通道可以异步地读写. 通道中的数据总是要先读到一个Buffer,或者总是要从一个Bu ...

  3. Serenity框架官方文档翻译前言(什么是Serenity平台)

    什么是Serenity平台 Serenity是一个 ASP.NET MVC / Javascript 的已经建立在开源技术上的平台 它的目标是让开发变得更容易,同时降低维护成本,避免样板式代码,减少重 ...

  4. linux命令别名的使用

    语 法:alias[别名]=[指令名称] 1,查看该用户下的别名: alias 2,有的系统里没有ll这个命令,原因就是没有定义ll='ls -l --color=tty'这个别名 如果想永久生效,就 ...

  5. seajs之seajs-debug坑

    最近遇到两个关于seajs-debug的坑 一个与preload有关,详情见https://github.com/seajs/seajs-debug/issues/15 一个与map时间戳有关,详情见 ...

  6. 让我们一起学习《Node.js入门》一书吧!

    Node.js入门 读完本书之后,你将完成一个完整的web应用,该应用允许用户浏览页面以及上传文件. 里面对一些知识的讲解,让你略窥Node.js的门径.最好一段代码一段代码的写下来,我的习惯是手里拿 ...

  7. JavaScript中的Function(函数)对象详解

    JavaScript中的Function对象是函数,函数的用途分为3类: 作为普通逻辑代码容器: 作为对象方法: 作为构造函数. 1.作为普通逻辑代码容器 function multiply(x, y ...

  8. [Effective JavaScript 笔记] 第7条:视字符串为16位的代码单元序列

    Unicode编码,基础:它为世界上所有的文字系统的每个字符单位分配一个唯一的整数,该整数介于0~1114111之间,在Unicode术语中称为代码点(code point). 和其它字符编码几乎没有 ...

  9. CoreLoation

    - (CLLocationManager *)locationManager { if (!_locationManager) { _locationManager = [[CLLocationMan ...

  10. glut64位操作系统安装

    64位win7下OpenGL的配置 - walkandthink的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/walkandthink/article/detai ...