【问题标题】:Convert a VARCHAR(n) to exact FLOAT将 VARCHAR(n) 转换为精确的 FLOAT
【发布时间】:2015-06-03 01:12:10
【问题描述】:

我有一个会计应用程序。在我的应用程序中,用户可以确定十进制数的个数,所以我不能使用decimal 数据类型,因为它具有固定的精度和小数位数。

根据这个话题, Use Float or Decimal for Accounting Application Dollar Amount?,永远不要使用浮点数,因为它只是一个近似值。 所以我使用VARCHAR(n) 作为我的列的数据类型。

现在,我想在此列上使用SUM 函数,并且我想要列的确切值。我该怎么做?

【问题讨论】:

  • 检查convert方法,你可以这样做:convert(float, yourVarcharColumn),也许它会给你一个开始。
  • 如果我转换为 float 值是否准确?
  • 请阅读我想将 VARCHAR 转换为浮点数并且他想将浮点数转换为 VARCHAR 的问题
  • 你是对的,我加错了网址:raresql.com/2013/04/26/…
  • 您可以使用 CLR 并将值加载到 BigRational 实现中。 (或者自己写。在字符串中求小数并不太难)

标签: sql-server type-conversion accounting


【解决方案1】:

您不能以正常方式对 CHAR 数据类型求和。您需要将其CONVERT 转为一个数字,然后进行计算。

我的建议是使用DECIMAL,如果最终用户可以更改精度和小数位数,请考虑您可以拥有的最大值并让 SQL Server 将其他数字设为 0

例如,如果您选择DECIMAL(19, 4),而最终用户选择只有 2 个刻度,SQL Server 会将其他两位数字设为 0

CREATE TABLE test(mny DECIMAL(18, 4))
INSERT INTO test VALUES (239428394.87)

SELECT * FROM test


OUTPUT
-----------------
239428394.8700

您还可以选择使用MONEY 数据类型。

Comparing MONEY and DECIMAL

如果你想使用CHAR,试试这个:

DECLARE @precision INT
        ,@scale INT
        ,@output VARCHAR(1000)
        ,@input CHAR(10) = '234234.453'

SELECT  @precision = LEN(LEFT(@input, CHARINDEX('.', @input) - 1)) + LEN(SUBSTRING(@input,CHARINDEX('.', @input) + 1, LEN(@input)))
        ,@scale = LEN(SUBSTRING(@input, CHARINDEX('.', @input) + 1, LEN(@input)))

SELECT @Output = 'SELECT SUM(CONVERT(DECIMAL(' + CONVERT(VARCHAR(100), @precision) + ', ' + CONVERT(VARCHAR(100), @scale) + '), ' + CONVERT(VARCHAR(100), @input) + '))'
SELECT @Output
EXEC (@Output)

您可以动态获取每个数字的精度和小数位数并进行动态查询

【讨论】:

  • 感谢您的回答我知道我不能对 CHAR 进行总和,但我想对我的查询进行一些转换。
  • 你可以SUM(CONVERT(DECIMAL(18, 4), value)) 但我强烈建议你不要使用CHAR
  • 但比例可能大于 4。我的问题是比例是动态的,用户现在可以确定比例我不知道该怎么办?
  • 将 DECIMAL(18, 4) 设为可能的最大值
  • 感谢您的想法。我使用实体框架,我不考虑动态查询。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 1970-01-01
  • 2015-11-05
  • 2013-06-11
  • 2011-12-17
  • 2020-03-09
相关资源
最近更新 更多