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

Sky*_*ard -1 sql t-sql sql-server

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

例如:

我正在尝试使用money数据类型来存储电话号码(它似乎是最优的存储大小)编辑:存储大小对我来说是一个主要问题(8字节为money数据类型而不是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部分?

gbn*_*gbn 8

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

如果你坚持,那么:

许多国家使用的领先零怎么样?

  • @Jeremy:"领先的零"像大多数欧洲bollixes一样使用.拨出国外时,零被抑制.国际前缀是"+",因为它可能不是00.它是varchar (3认同)

Abe*_*ler 6

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

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

  • @Skyguard:这是一个不成熟的优化.乘法和CAST需要多少处理?由于行如何适合页面,每行额外的几个字节最有可能是微不足道的 (5认同)
  • @Skyguard:1-800-GOFEDEX或1-800-PICK-UPS怎么样? (3认同)
  • @skyguard:我给了你解决方案*和*反馈.我在每分钟有数百万个插入*的系统上工作*并且会使用varchar (3认同)
  • @Skyguard问题从未保留小数位.在金钱方面,一切都得以保留.这是您使用默认格式转换为varchar.无论您为什么要转换,转换总是很昂贵.并且数百万行的转换也非常昂贵 - 并且转换数百万行以尝试搜索特定区域代码中的所有电话号码也将是昂贵的 - 这对于varchar列上的索引来说非常快. (2认同)