我使用cast()后,数据为什么没有被四舍五入?

imerak 2021-10-08 08:26:21

我的视图中的“发货款”字段是decimal:

 

 

按说应该是四舍五入的,但是运行后:

 

计算后没有经过cast的原值是:201258.675
而被cast函数处理后,应该四舍五入为:201258.68 的,但实际却是:201258.67。四舍五入失灵?

 

我刚刚又查了下,发现这个情况还不少,有的进位,有的却不进,奇怪。见下图(红框中是没有进位的):

 

...全文
892 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
doloopcn 2021-10-09
  • 打赏
  • 举报
回复

DELPHI中ROUND也是一样
应该是系统的四舍五入算法为“银行家”算法,具体去看我BLOG吧。所谓的奇进偶不进,如果要得到正常结果应该要自己写算法

morliz子轩 2021-10-09
  • 打赏
  • 举报
回复

cast根本不是做数值位数转换,只是做数据类型相互转换。
你应该用convert()。
或者用Round()。

xiaoxiangqing 2021-10-08
  • 打赏
  • 举报
回复

img

xiaoxiangqing 2021-10-08
  • 打赏
  • 举报
回复

用字面量转是没有问题的,但如果是从列里取,就不行
DECLARE @d FLOAT
SET @d=201258.675
SELECT @d,CAST(@d AS DECIMAL(15,2)),CAST( CAST(@d AS DECIMAL(15,8)) AS decimal(15,2))
分别输出 201258.675 201258.67 201258.68

锟斤拷锟斤拷 2021-10-08
  • 举报
回复
@xiaoxiangqing 这个好像是float的问题,CAST( CAST(CAST(@d AS DECIMAL(15,8)) AS FLOAT) AS decimal(15,2))也是67
zjcxc 元老 2021-10-09
  • 举报
回复
@xiaoxiangqing 精度的问题,float是不精确的,但它在转换处理时,仍然是舍入的处理方式,这个在官方帮助文档中对 CAST 转换描述中有明确说明 但由于float是不精确的表示方法,所以你看到的不代表它的精度值就是那个,你用 201258.675001 去转,得到的结果就是 201258.68 所以你从列中取,要保证最终的精确结果的话,要避免它自动给你转成 float,或者你先转成 decimal(15,3),再转成 decimal(15,2),这样可以降低精度损失带来的问题
imerak 2021-10-09
  • 举报
回复
@zjcxc 这样确实解决问题了。明白了一些。我再消化下。感谢。
zjcxc 元老 2021-10-08
  • 打赏
  • 举报
回复

确定你的版本
select @@version

imerak 2021-10-08
  • 举报
回复
@zjcxc Microsoft SQL Server 2014 - 12.0.2000.8 (X64) Feb 20 2014 20:04:26 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
锟斤拷锟斤拷 2021-10-08
  • 打赏
  • 举报
回复

SELECT CAST('201258.675' AS NUMERIC(18,2))的结果是201258.68啊,会不会是语句哪里写错了

imerak 2021-10-08
  • 举报
回复
@锟斤拷锟斤拷 cast((ISNULL(dbo.T_7_分户账.发货单价, 0) + ISNULL(dbo.T_7_分户账.后附单价, 0)) * (dbo.T_7_分户账.发货重量T + ISNULL(dbo.V_7_分户账_修改结算重量.全部状态改重合计kg, 0) / 1000) as decimal(18,2)) AS 发货款 没有错吧。 另外怎么在回复中贴图呢?
锟斤拷锟斤拷 2021-10-09
  • 举报
回复 1
@imerak 【dbo.T_7_分户账.发货单价】【dbo.T_7_分户账.后附单价】【dbo.T_7_分户账.发货重量T】【dbo.V_7_分户账_修改结算重量.全部状态改重合计kg】这几个字段的数据类型是什么呢?

34,870

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧