我有一个表ProductAmount
,其中包含
Id [BIGINT]
Amount [FLOAT]
现在,当我将值从表单传递到表格时,它将以2.46237846387469E+15
格式存储,而实际值为2462378463874687
。有什么想法为什么要转换这个值以及如何阻止这个?
答案 0 :(得分:1)
它没有被转换。这就是浮点表示。你所看到的是科学/指数格式。
我猜你不想以那种方式存储数据。您可以更改列以使用固定格式表示:
alter table ProductAmount alter amount decimal(20, 0);
这假设您不需要任何小数位。您可以在documentation中了解有关十进制格式的更多信息。
我强烈建议您不要使用float
,除非:
通用和商业应用程序通常不需要浮点数。
答案 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位尾数。