如何在money数据类型中保留小数位后面的数字?

时间:2011-08-22 20:30:41

标签: sql sql-server tsql

如何在money数据类型中保留小数位后面的数字? 我遇到的问题是每当我尝试将数据转换为字符串时,我都会失去精确度......

例如:

我正在尝试使用money数据类型来存储电话号码(它似乎是最佳的存储大小)编辑:存储大小对我来说是个主要问题(对于money数据类型而言是8字节而不是对于varchar字段而言是16字节以上)

如果我在小数点右侧存储10位数字,小数点右侧3-4位数作为扩展名,当我尝试“解析”扩展名时,我似乎失去了更多2位数

所以这样的电话号码:(305)444-1234分机283将存储在这样的货币数据类型中:3054441234.283

我遇到的问题是如果我使用CAST(myMoneyValue作为varchar(x))则3054441234.283变为3054441234.28

任何人都可以帮忙吗?

EDIT2:让我假装片刻我没有提到在那里存储电话号码...让我说有一个原因我需要将money数据类型与varchar字段连接起来......例如如果我想连接'$'+ 0.1125 +'/ sqft。' - 有没有办法保留钱币领域的.0025部分?

7 个答案:

答案 0 :(得分:8)

您将电话号码存储在varchar字段中,可能会分解为国家/地区代码,分机号码等。

如果你坚持,那么:

许多国家使用的前导零怎么样?

答案 1 :(得分:6)

停止使用money数据类型存储电话号码。如果您想将它作为varchar,那么将其存储为varchar。将它存储为其他东西只是为了稍后转换它是没有意义的。

它也会让以后查看你的数据的其他人感到困惑(比如在你被公共汽车撞到并且没有留下任何文件之后)。此外,强制转换可能会导致索引使用出现问题,并且可能会严重降低查询速度。

答案 2 :(得分:4)

CAST(myMoneyValue as varchar(x))默认采用两位小数(将钱转换为varchar)。你可以强制它到你想要的任意数量的小数位。

但是你不知道如果它是提前3或4位数的延长(1234567.123 - 是123-4567 x 123或123-4567 x 1230 - 它们都是相同< / strong>在money / decimal的内部表示中 - 除非你总是在小数点后左边填充它们的麻烦 - 1234567.0123是123-4567 x 123 - 所以现在这些钱在他们的“本机”中甚至不是人类可读的形式“)。

我认为这几乎说明了为什么你不应该使用十进制或金钱来获取这些数据。

答案 3 :(得分:3)

您正在努力使您的任务变得复杂 - 只需将电话号码存储为适当长度的 char varchar

关于EDIT2:

moneysmallmoney转换为字符数据的style value为:

  • 0(默认值) - 小数点左边每三位数字都没有逗号,小数点右边两位数字;例如, 4235.98
  • 1 - 小数点左侧每三位数字逗号,小数点右侧两位数字;例如, 3,510.92
  • 2 - 小数点左边每三位数字都没有逗号,小数点右边四位数字;例如, 4235.9819

您需要使用最后一个:

CONVERT(varchar(x), myMoneyValue, 2)

答案 4 :(得分:2)

您最大的问题是您尝试以money数据类型存储电话号码。不要这样做,然后你就不会有这个问题。

电话号码不是传统意义上的“号码”。例如,前导零是重要的。

答案 5 :(得分:2)

尝试施放为NUMERIC(14,4)。对于这种情况,Money并不是一个好的数据类型,正是因为你看到的原因。

答案 6 :(得分:1)

Runnable example

-- http://msdn.microsoft.com/en-us/library/ms187928.aspx

DECLARE @money AS MONEY = 12345.6789

SELECT CONVERT(varchar, @money), CONVERT(varchar, @money, 2)