【问题标题】:the reason behind loss of precision/overflow when converting "decimal or numeric" data type转换“十进制或数字”数据类型时丢失精度/溢出的原因
【发布时间】:2017-03-08 11:49:32
【问题描述】:

我目前正在MSDN 上学习“数字”数据类型,并遇到了以下短语。

从十进制或数字转换为浮点数或实数可能会导致一些 精度损失。从 int、smallint、tinyint、float 转换, real、money 或 smallmoney 转换为小数或数字可能导致 溢出。

在转换“十进制或数字”数据类型时,我真的不明白丢失精度/溢出的原因。谁能给我解释一下?

【问题讨论】:

  • 简单来说,你可以用更少的数字/空格来代表你的号码

标签: sql sql-server tsql


【解决方案1】:

每种不同类型的数字表示具有不同的数量,它可以存储在内存中。一个简单的例子是使用 int 和 tinyint。

一个 tinyint 有 2 个字节的存储空间,因此可以容纳 32,767 的最大值。一个 int 有 4 个字节,因此可以容纳 2,147,483,647 的最大值。

如果您尝试将 int 转换为 tinyint,并且 int 的值大于 tinyint 的限制 (> 32,767),那么您将遇到问题。有些语言会回绕,有些会溢出。

【讨论】:

    【解决方案2】:

    documentation 清楚地涵盖了它。

    用于浮点数值的近似数数据类型 数据。浮点数据是近似的;因此,并非所有值 数据类型范围可以精确表示。

    .NET 或任何框架中的浮点数都将是近似数数据类型。

    【讨论】:

      【解决方案3】:

      Decimal 或 Numeric 数据类型实际上是带有小数分隔符位置的整数。 关于声明的精度,它们可以存储最小值和最大值之间的每个值。正如 Ryan 所说,您可以在 -32k 到 32k 的四个字节内存储大约 64k 个不同的值。如果你制作一个四字节浮点类型,范围会更宽,但仍有64k 个不同的值需要存储。 该范围内的某些值无法精确存储。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2021-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-03
        相关资源
        最近更新 更多