Sql 如何最好地将十进制转换为整数?

Sql 如何最好地将十进制转换为整数?,sql,ruby,Sql,Ruby,我正在用Ruby on Rails 4构建一个金融应用程序,我需要在数据库(SQLite和MySQL)中存储0.83423423432534634546等值 我尝试将这些值存储在数据库中,作为小数 但是,我遇到了一些非常严重的浮点错误,因此我想将它们存储为整数 如何将0.445754646354664233443这样的值转换为整数,反之亦然 谢谢您的帮助。您的问题的答案是:如果您希望将数值的最大精度保持在小数点以下n位,那么: 原始值到整数:(值*10**n)。到i integer到原始值:i

我正在用Ruby on Rails 4构建一个金融应用程序,我需要在数据库(SQLite和MySQL)中存储
0.83423423432534634546
等值

我尝试将这些值存储在数据库中,作为
小数

但是,我遇到了一些非常严重的浮点错误,因此我想将它们存储为
整数

如何将
0.445754646354664233443
这样的值转换为整数,反之亦然


谢谢您的帮助。

您的问题的答案是:如果您希望将数值的最大精度保持在小数点以下n位,那么:

  • 原始
    到整数:
    (值*10**n)。到i
  • integer
    到原始值:
    integer/(10**n)。到f

但如果我是你,我宁愿听从塞尔吉奥的建议。

你的问题的答案是:如果你想让数值的最大精度保持在小数点以下n位,那么:

  • 原始
    到整数:
    (值*10**n)。到i
  • integer
    到原始值:
    integer/(10**n)。到f

但如果我是你,我宁愿听从塞尔吉奥的建议。

你的金融应用程序根本不能使用SQLite

十进制(m,n)或数字(m,n)类型的值不会发生浮点错误,除非处理不当

create table test (
  -- 15 digits left of the decimal; 20 digits right of the decimal.
  n decimal(35, 20)
);

insert into test values (123456789012345.83423423432534634546);

select * from test;
246913578.246914 SQLite将答案四舍五入到15位

对于Rails,我在开发、测试和生产环境中只使用MySQL或PostgreSQL。我只有在闲逛时才使用SQLite


  • SQLite完全没有数据库意义上的数据类型。SQLite拥有它所称的存储类
    你的金融应用程序根本无法使用SQLite

    十进制(m,n)或数字(m,n)类型的值不会发生浮点错误,除非处理不当

    create table test (
      -- 15 digits left of the decimal; 20 digits right of the decimal.
      n decimal(35, 20)
    );
    
    insert into test values (123456789012345.83423423432534634546);
    
    select * from test;
    
    246913578.246914 SQLite将答案四舍五入到15位

    对于Rails,我在开发、测试和生产环境中只使用MySQL或PostgreSQL。我只有在闲逛时才使用SQLite


  • SQLite完全没有数据库意义上的数据类型。SQLite拥有它所称的存储类
    你可能会失去准确性。将它们转换为字符串,这样更安全。可能会丢失精度。把它们转换成字符串,这样更安全。嗨,迈克。你的文章可能帮我省去了很多麻烦。事实上,我在开发中使用SQLite,并且在过去遇到了几个(我所认为的)浮点错误。因此,我决定将所有货币值存储为
    整数
    ,并在每次在视图中处理它们时使用getter和setter方法将它们转换为
    小数
    (这实际上相当麻烦)。因此,如果我理解您在开发中正确地从SQLite切换到MySQL,然后将所有货币值存储在type
    decimal
    列中是我的最佳选择?是的,我认为您应该在开发中切换到MySQL。(我认为几乎每个Rails开发人员都应该在开发、测试和生产中使用相同的dbms。)并且,是的,使用decimal(m,n)作为数据类型。好的,非常感谢您的帮助。你的帖子让我大开眼界。我想知道为什么他们告诉所有Rails新手从SQLite DB开始…@Tintin81:SQLite不需要任何设置。我很确定它默认安装在所有Linux发行版上。它更简单;你不必知道任何密码,无论是使用tcp/ip还是套接字,使用哪个端口,等等。是的,这也是吸引我的原因:-(嗨,迈克。你的文章可能帮我省去了很多麻烦。事实上,我在开发中使用SQLite,遇到了几个(我想的)过去的浮点错误。因此,我决定将所有货币值存储为
    整数
    ,并在每次在视图中处理它们时使用getter和setter方法将它们转换为
    小数
    (这实际上相当麻烦)。因此,如果我理解您在开发中正确地从SQLite切换到MySQL,然后将所有货币值存储在type
    decimal
    列中是我的最佳选择?是的,我认为您应该在开发中切换到MySQL。(我认为几乎每个Rails开发人员都应该在开发、测试和生产中使用相同的dbms。)是的,使用十进制(m,n)作为数据类型。好的,非常感谢你的帮助。你的帖子真的让我大开眼界。我想知道为什么他们告诉所有Rails新手从SQLite DB开始…@Tintin81:SQLite不需要任何设置。我非常确定它默认安装在所有Linux发行版上。它更简单;你不必知道任何密码,是否使用tcp/ip或者一个插座,使用哪个端口,等等。是的,这也是吸引我的原因:-(从技术上来说,这是我问题的正确答案,但我会将迈克的答案标记为正确答案,因为它避免了我将来的许多麻烦。谢谢你的帮助。从技术上来说,这是我问题的正确答案,但我会将迈克的答案标记为正确答案,因为它避免了我将来的许多麻烦谢谢你的帮助。
    sqlite> create table test (
       ...>   -- 15 digits left of the decimal; 20 digits right of the decimal.
       ...>   n decimal(35, 20)
       ...> );
    sqlite>     
    sqlite> insert into test values (123456789012345.83423423432534634546);
    sqlite>   
    sqlite> select * from test;
    
    123456789012346.0
    sqlite> delete from test;
    sqlite> INSERT INTO "test" VALUES('123456789.123456789012345');
    sqlite> select * from test;
    
    123456789.123457
    sqlite> drop table test;
    sqlite> create table test (n text);
    sqlite> INSERT INTO "test" VALUES('123456789.123456789012345');
    sqlite> select n from test;
    
    123456789.123456789012345
    sqlite> select n*2 from test;
    
    246913578.246914