【问题标题】:sql type float, real, decimal?sql类型浮点数,实数,小数?
【发布时间】:2011-07-12 04:06:51
【问题描述】:

在我的数据库中,我有一个产品价格的列 我把它作为float,我的问题是如果我从我的 c# 应用程序开始保存它 作为 10.50 .. 在查询中它返回 10,50,如果我更新我得到一个错误 10,50 无法转换为 float ... 或类似的东西.. 如果我把它保存为decimal,在sql管理里面的查询..没问题.. 但在我的 c# 应用程序中......我得到了同样的错误...... 10.50 retuns as 10,50 我不知道为什么,以及如何解决它.. 我独特的解决方案保存了它 作为varchar...

【问题讨论】:

  • 不要使用浮动价格。你用的是什么数据库?

标签: c# sql floating-point decimal


【解决方案1】:

这是某种本地化问题。 10,50 是写十个半的“欧洲”方式。如果您是从 select 语句中得到的,那么您的数据库可能配置不正确。

【讨论】:

    【解决方案2】:

    一般来说,您应该在所有图层中使用相同的类型。所以如果数据库中的底层类型是x,你也应该在c#中传递那些具有相同类型的数据。

    您选择什么类型取决于您存储的内容——您不应该为了让某些东西“工作”而切换类型。为此,将数字数据存储在非数字类型(例如 varchar)中很快就会对您产生影响。很高兴你打开了这个问题来解决这个问题!

    正如其他人奇迹般地推断,您可能会遇到本地化问题。这是一个很好的例子,说明了为什么将数字存储为字符串是一个问题。如果您正确地接受他们想要(或您想要)的任何文化/本地化的用户输入,并将其放入数字类型变量中,那么其余的(与 DB 对话)应该很容易。更重要的是,如果可以的话,你不应该在数据库中进行数字格式化——这些东西最好放在前端,离用户更近。

    【讨论】:

      【解决方案3】:

      我认为您在 windows 区域和语言中的十进制符号设置是错误的。请将其设置为点并再次测试。

      【讨论】:

        【解决方案4】:

        这可能有助于临时使用,但我不建议永久使用:

        尝试在保存文件之前将数字转换为字符串,将逗号替换为句点(From , to .),然后将其作为字符串保存到数据库中,希望它应该看到它格式正确,并将其转换为数据库所认为的“十进制”或“浮动”。

        希望这会有所帮助。

        【讨论】:

          【解决方案5】:

          是的,本地化。

          也就是说,我认为您的图片存储在 SQLServer 的“金钱”字段中(我假设它是您正在使用的 SQLServer)。如果那是数据库中的浮点数,它将返回一个正常的小数点,而不是欧洲货币分隔符“,”。

          修复: 在你的c#代码中不要使用浮点数,除非你绝对需要一个浮点数。请改用 decimal 类型。这不仅仅是在这种情况下,而是在所有情况下。浮点数是二进制(以 2 为底),而不是十进制(以 10 为底),因此您在界面中看到的只是实际数字的十进制近似值。结果就是经常(1 == 1) evaluates as false!

          我自己也遇到过这个问题,如果您不知道会发生这种情况,那真是令人抓狂。在 c# 中始终使用 decimal 而不是 float

          好的,在你修复它之后,然后执行此操作以获得正确的本地化:

          using System.Globalization;
          ...
          
          NumberFormatInfo ni = new NumberFormatInfo();
          ni.CurrencyDecimalSeparator = ",";
          decimal price = decimal.Parse(dbPriceDataField, ni);
          

          请注意,“dbPriceDataField”必须是一个字符串,因此您可能需要对该数据库结果集的字段执行“.ToString()”。

          如果您最终不得不处理该货币领域的其他“货币”方面,例如货币符号,请查看:http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.aspx

          如果您需要更强大的错误处理,请将 decimal.Parse 放入 try/catch,或使用 decimal.TryParse。

          编辑 --

          如果您知道数据库设置为哪种文化(实际上是国家/地区),您可以这样做:

          using System.Globalization;
          ...
          CultureInfo ci = new CultureInfo("fr-FR"); // fr-FR being "french France"
          decimal price = decimal.Parse(dbprice, ci.NumberFormat);
          

          【讨论】:

            【解决方案6】:

            我在我的 Web 应用程序中遇到了这样的问题......但我找到了解决方案,就像我在文本框中获取我的价格值一样。所以我附上了数据库。因此,当您使用文本框附加数据库时...当您右键单击文本框并单击 Edit DataBinding...时,您必须提供...在 Bind Property 中键入... {0:N2}

            这仅适用于网络应用程序或网站...不适用于桌面应用程序...

            【讨论】:

            • 如果您的数据库与 this 具有一致的值,它不会太在意......所以浮点或小数没有问题......但我使用了小数(5,2)数据类型。 ..
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-06-26
            • 2020-10-22
            • 1970-01-01
            相关资源
            最近更新 更多