浮点类型存储格式为" 2.46237846387469E + 15"

时间:2017-10-16 13:29:23

标签: sql sql-server-2008

我有一个表ProductAmount,其中包含

Id [BIGINT]
Amount [FLOAT]

现在,当我将值从表单传递到表格时,它将以2.46237846387469E+15格式存储,而实际值为2462378463874687。有什么想法为什么要转换这个值以及如何阻止这个?

2 个答案:

答案 0 :(得分:1)

它没有被转换。这就是浮点表示。你所看到的是科学/指数格式。

我猜你不想以那种方式存储数据。您可以更改列以使用固定格式表示:

alter table ProductAmount alter amount decimal(20, 0);

这假设您不需要任何小数位。您可以在documentation中了解有关十进制格式的更多信息。

我强烈建议您不要使用float,除非:

  • 您有一个实际的浮点数(比如统计计算的预期值)。
  • 您有各种各样的值(例如,0.00000001到1,000,000,000,000,000)。
  • 在很宽的范围内,您只需要固定数量的精度数字。

通用和商业应用程序通常不需要浮点数。

答案 1 :(得分:1)

该值以二进制格式存储,因为这是您通过请求FLOAT作为列的数据类型而指定的。

您在字段中存储的值完全表示,因为64位FLOAT使用52位来表示尾数 * 。即使您在选择返回值时看到2.46237846387469E+15,也只是稍微关闭的演示文稿:存储在数据库中的实际值与您插入的数据相匹配。

  

但我希望将2462378463874687存储为我的数据库

中的值

你已经在做了。这是存储在字段中的确切值。您无法看到它,因为SQL Management Studio的查询工具使用科学记数法对其进行格式化。当您对该值进行任何计算,或将其重新读回程序中的double字段时,您将返回2462378463874687

如果您想在SQL Management Studio中查看select查询中的确切数字,请使用CONVERT

CONVERT (VARCHAR(50), float_field,    128) -- See note below

注1: 128是不推荐使用的格式。它将与SQL Server-2008一起使用,这是您的问题的标记之一,但在SQL Server 2016及更高版本中,您需要使用3

注2:由于列的名称为Amount,因此很有可能您正在寻找不同的数据类型。查看decimal数据类型,它们更适合表示货币金额。

* 2462378463874687就在边界上,用于精确表示,因为它使用全部52位尾数。