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. IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol)。

    IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol).IMA ...

  2. TopCoder SRM 590

     第一次做TC,不太习惯,各种调试,只做了一题...... Problem Statement     Fox Ciel is going to play Gomoku with her friend ...

  3. JSON做下拉表格

    主页面,5-18j.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...

  4. 输入的全角字符转换成半角字符--css、js、ASP.NET

    我们经常需要用户在表单中输入数字,用户不小心使用了全角状态输入数字,但是在程序中全角的数字是不能直接转换为数字的.这种全角数字的错误处理起来就有些麻烦了.对一些没有经验用户来说明明已经输入数字了,怎么 ...

  5. Poj 3233 Matrix Power Series(矩阵二分快速幂)

    题目链接:http://poj.org/problem?id=3233 解题报告:输入一个边长为n的矩阵A,然后输入一个k,要你求A + A^2 + A^3 + A^4 + A^5.......A^k ...

  6. Linux瑞士军刀:密码管理Keeweb

    导读 如今,我们依赖于越来越多的线上服务.我们每注册一个线上服务,就要设置一个密码:如此,我们就不得不记住数以百计的密码.这样对于每个人来说,都很容易忘记密码.我将在本文中介绍 Keeweb,它是一款 ...

  7. unity3d的四元数 Quaternion

    原地址:http://www.cnblogs.com/88999660/archive/2013/04/02/2995074.html 今天准备学习和研究下unity3d的四元数 Quaternion ...

  8. [BZOJ2423][HAOI2010]最长公共子序列

    [BZOJ2423][HAOI2010]最长公共子序列 试题描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x ...

  9. php数组转换js数组操作及json_encode应用

    对于php,个人感觉能够熟练操作数组和字符串,基本上已经是入门了,php本身有很多操作数组和字符串的函数,今天在做一个功能时,需要用Js动态的创建门店信息,这些信息是要从后台添加的,想来想去,通过ph ...

  10. java中四种阶乘的计算

    package com.zf.s2;//创建一个包   import java.math.BigInteger;//导入类 import java.util.ArrayList; import jav ...