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

时间:2014-06-27 13:05:23

标签: sql ruby

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

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

但是,我遇到了一些非常讨厌的浮点错误,所以我想将它们存储为integers

如何将0.4457546346354664233443之类的值转换为整数,反之亦然?

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

您的财务应用程序根本无法使用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;
123456789012345.83423423432534634546

SQL 中,使用十进制和数字数据类型的算术在数字中完成。但是使用数字和浮点数进行算术运算,并且您将获得浮点数或双精度数。 (这是一种误操作。)

这在MySQL中可以正常工作(上图),但在SQLite(下面)中失败 - 没有错误或警告 - 。

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 数字或十进制数据类型 1 。除了文字之外,它只为您提供15位数字,无论您说什么。

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

SQLite将答案四舍五入。

使用Rails,我在开发,测试,生产环境中只使用MySQL或PostgreSQL。我只在我鬼混的时候使用SQLite。


  1. 在数据库意义上,SQLite根本没有数据类型。 SQLite改为调用存储类Docs

答案 1 :(得分:1)

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

  • 原始value到整数:(value * 10 ** n).to_i
  • integer原始值:integer / (10 ** n).to_f

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