【问题标题】:why does sql server return 0 for 1 / 2?为什么 sql server 为 1 / 2 返回 0?
【发布时间】:2015-11-04 08:45:09
【问题描述】:

在 sql server 中,当我选择 1 / 2 时,它返回 0 而不是 0.5
这是为什么?

不应该所有除法都返回一个十进制值吗? 有没有可以设置让它正常分割的设置?

我在 c# 中注意到了同样的情况
这背后的逻辑是什么?

【问题讨论】:

  • 截断。整数除法。
  • 现实生活中没有有限的精度数据类型。大多数编程环境会或需要对任意精度数据类型进行特殊处理。更不用说,在现实生活中,我们可以轻松处理非终止小数。
  • 为什么更改类型比使用相同类型但丢弃其余部分更正确?如果您希望计算并保留小数位,请使用小数。
  • @GuidoG - “除法的结果不能存储到 int 中” - 4/2 可以非常清楚地存储在 int 中。是否应根据具体情况决定数据类型?
  • 那么1/7的结果是什么?

标签: sql sql-server


【解决方案1】:

整数除法

select 1 / 2  
-- 0

浮点除法(至少一个参数必须是浮点/十进制):

select 1 / 2.0
-- 0.5

select 1.0 / 2
-- 0.5

select 1.0 / 2.0
-- 0.5

Divide

如果一个整数被除数除以一个整数除数,结果是 结果的任何小数部分被截断的整数。

编辑:

关键是你问为什么? 因为语言的创造者如此决定,历史,惯例。

我建议阅读Is integer division uniquely defined in mathematics?

请记住,在某些语言中,您有 2 个除法运算符(一个用于整数除法,一个用于实数除法)。

Division Integer

在计算机程序中除以整数需要特别小心。一些 诸如 C 之类的编程语言将整数除法视为案例 5 上面,所以答案是一个整数。其他语言,例如 MATLAB 并且每个计算机代数系统都返回一个有理数作为 答案,如上面的案例 3。这些语言还提供功能 直接或从结果中获取其他情况的结果 案例 3。

用于整数除法的名称和符号包括 div、/、\ 和 %。 当被除数或 除数为负:四舍五入可能趋近于零(所谓 T-division)或朝向-∞(F-division);可能会出现更罕见的样式 - 见 取模运算详情。


对于不赞成投票的人发表评论,以便我回复/改进我的回答。

【讨论】:

  • 这个主意是谁想出来的?
  • @GuidoG 语言/sql 服务器引擎的创建者。你的问题是为什么而不是如何?我建议在programmers.stackexchange.com Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. 问这个问题你的问题是关于历史/惯例的。
  • @GuidoG - 好吧,我可以找到用这些术语定义的除法,至少可以追溯到 1967 年的语言 BCPL。C 语言从那里继承了这种行为,并且 许多语言都将 C 的基础作为自己的,因为没有更好的替代方案。
  • 在编程时很容易忘记将一个值转换为十进制,编译器不会抱怨,所以除非有人进行了良好的单元测试,否则没有人会注意到它,但即使在这里它也可能被忽视。这使得小错误出现在生产环境中,这就是这里发生的事情,我必须再次调试其他人的工作才能再次找到另一个部门
  • @GuidoG 从编译器的角度来看,一切都是正确的。像这样思考左侧(int)/右侧(int)。除法算法是精确的。为什么编译器应该关心结果不是浮动的。开发人员有责任对其进行检查。但我同意 2 除法运算符会更清晰,例如 div and /
猜你喜欢
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 2022-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 1970-01-01
相关资源
最近更新 更多