首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Rails 3.为什么我的十进制值行是#<BigDecimal:5003750,'0.1E2',9(18)>>等值?

关于这个问题,我们首先需要了解一下BigDecimal类以及十进制值表示方法。

BigDecimal是一个精确的浮点数计算类,它可以处理任意精度的浮点数,避免了浮点数计算中的精度损失问题。在Ruby中,BigDecimal类用于表示具有任意精度的十进制数。

在您的问题中,#<BigDecimal:5003750,'0.1E2',9(18)>>表示一个BigDecimal对象,其值为0.1E2,即10。这里的表示方法是科学计数法,其中E表示10的幂,后面的数字表示10的幂数。在这个例子中,10的幂数为2,即10的2次方,即100。

所以,您的十进制值行#<BigDecimal:5003750,'0.1E2',9(18)>>等于100。

如果您想将BigDecimal对象转换为普通的数字,可以使用to_f方法将其转换为浮点数,或者使用to_i方法将其转换为整数。例如:

代码语言:ruby
复制
big_decimal = BigDecimal.new('0.1E2')
integer_value = big_decimal.to_i # 结果为100

希望这个答案能够帮助您解决问题。如果您有其他问题,请随时提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

BigDecimal和BigInteger

BigDecimal介绍 背景 我们知道计算机都是以二进制的形式存储数据的,而我们日常则是使用十进制,那么我们的 数字 存进计算机则需一个进制转换的过程,这过程就会损失精度的,就导致浮点数不能用等值判断...后面这截取的无限小数还原成十进制就会损失精度不准确,不能用等值判断了 救星 BigDecimal的横空出世是为了解决浮点数的精度问题,其全限定类名为 java.math.BigDecimal,BigDecimal...是一个对象,代表着不变的,任意精度的带符号的十进制数字,我们要使用该对象的方法来进行加减乘除的操作 原理 既然十进制小数转成二进制会损失精度,那么把十进制小数扩大成整数再转成二进制则会保持精度了 2....System.out.println(num2); // 0.1 因为浮点数并不是一个准确的值,而String类型的就确定 2.2 常用方法 方法 描述 abs() 返回一个绝对值BigDecimal...比较用compareTo,而equals要求scale()即小数位数相同 ArithmeticException常见的算数异常 3.

1.2K10

【优雅的避坑】你的钱算错了!为什么0.1+0.2不等于0.3了!?

问题初现 我碰到过这样一个问题,对项目上用车记录中的用车里程、油耗、计价等数据进行计算,有一辆车花费了108.1元,还有一辆车的花费是29.2元,当计算这两个价格的和时出问题了,结果竟然不是137.3,...当时我是不慌的,出现这种问题一般就是和定义的数据类型有关,一开始我们定义里程、油耗和价格等数据指标时,全部用Double定义的,问题就出现在这里!...计算机内部是用位来存储和处理数据的。用一个二进制串表示数据,十进制转换成二进制,二进制转换成十进制的方法是: 十进制转二进制:除2取余 二进制转十进制:乘2取整 那么,十进制的0.1转成二进制: ?...为什么说大部分的十进制小数呢,因为像0.5这样分母是2的倍数的十进制数是没有舍入误差的,计算机能够用二进制精确表示。...二进制无法精确表示大部分的十进制小数。 【强制】禁止使用构造方法 BigDecimal(double) 的方式把 double 值转化为 BigDecimal 对象。

51620
  • 利用BigDecimal类巧妙处理Double类型精度丢失

    关于浮点数存储精度丢失的问题,话题过于庞大,感兴趣的同学可以自行搜索一下:【解惑】剖析float型的内存存储和精度丢失问题 这里简单讨论一下十进制数转二进制为什么会出现精度丢失的现象,十进制数分为整数部分和小数部分...我想写到这就不必再写了,你应该也已经发现, // 上面的过程已经开始循环,小数部分永远不能为0 这个算法有一定概率会存在无限循环,即无法用有限长度的二进制数表示十进制的小数,这就是精度丢失问题产生的原因...); } /** * 比较大小 * 阿里巴巴开发规范明确:比较BigDecimal的等值需要使用compareTo,不可用equals * equals会比较值和精度...equals方法与compareTo方法不同,此方法仅在两个BigDecimal对象的值和精度都相等时才被认为是相等的,如2.0和2.00就是不相等的。...参考阅读 LanceToBigData:Java之BigDecimal详解 为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?

    2.3K10

    你以为用了BigDecimal后,计算结果就一定精确了?

    大家好,我是你们的跃哥。首先问大家一个问题,平时加减乘除用的大部分是不是int类型,如果遇到金额计算,你们用什么呢?...在之前的一篇文章中,我们介绍过,使用BigDecimal的equals方法并不能验证两个数是否真的相等(为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?)。... 这是一条【强制】建议,那么,这背后的原理是什么呢? 想要搞清楚这个问题,主要需要弄清楚以下几个问题: 1、为什么说double不精确? 2、BigDecimal是如何保证精确的?...如果大家看过BigDecimal的源码,其实可以发现,实际上一个BigDecimal是通过一个"无标度值"和一个"标度"来表示一个数的。 在BigDecimal中,标度是通过scale字段来表示的。...false,具体原因和解决办法参考为什么阿里巴巴禁止使用BigDecimal的equals方法做等值比较?

    91420

    阿里云面试:为什么建议使用 BigDecimal 进行浮点数运算?

    这也就是解释了为什么浮点数没有办法用二进制精确表示。...就比如说十进制下的 0.2 就没办法精确转换成二进制小数: // 0.2 转换为二进制数的过程为,不断乘以 2,直到不存在小数为止, // 在这个计算过程中,得到的整数部分从上到下排列就是二进制的结果。...想要解决浮点数运算精度丢失这个问题,可以直接使用 BigDecimal 来定义浮点数的值,然后再进行浮点数的运算操作即可。...(n);// 1.255 BigDecimal 等值比较问题 《阿里巴巴 Java 开发手册》中提到: BigDecimal 使用 equals() 方法进行等值比较出现问题的代码示例: BigDecimal...1.0 的 scale 是 1,1 的 scale 是 0,因此 a.equals(b) 的结果是 false。

    50210

    BigDecimal知识回顾

    介绍 我们之前做的民生银行的培训系统时大量的用到了BigDecimal用于计算学分和金额等数据,那为什么这类数据不用double而是用Bigdecimal,接下来进行小结一下 Bigdecimal是java.math...包下的一个类,不可变的、任意精度的有符号十进制数,BigDecimal类使用户能完全控制舍入行为,如果需要精确计算的结果,则必须使用BigDecimal BigDecimal 的等值比较应使用 compareTo...(1.0);中的值是int类型,那么计算出来也是有问题的见以下案例 @Test public void bigDecimal1(){ BigDecimal h = new...两个BigDecimal值如果除不尽就会报错,见截图 java开发手册规约 【强制】禁止使用构造方法 BigDecimal(double)的方式把 double 值转化为 BigDecimal 对象...这里得出的是一个近似0.1的值

    81120

    Java中使用BigDecimal处理金额计算:精确性、安全性与最佳实践

    有没有遇到过相关的技术坑?”为什么选择BigDecimal?BigDecimal类提供了任意精度的带符号十进制数,非常适合需要精确小数点运算的场景。...与float和double不同,BigDecimal对象是不可变的,这意味着一旦创建了一个BigDecimal实例,其值就不能被修改。...精度控制在使用BigDecimal时,可以通过构造函数或静态工厂方法valueOf来创建对象。但值得注意的是,直接使用double类型的值来构造BigDecimal可能会导致精度损失。...【强制】禁止使用构造方法BigDecimal(double) 的方式把double值转化为BigDecimal对象,非要转那?...无论是电商平台的支付模块,还是金融应用中的交易系统,正确使用BigDecimal都是保障业务顺利进行的关键。

    18910

    Double为什么会丢失精度

    十进制科学计数法要求有效数字的整数部分必须在【1,9】区间内。...3.走进失真之精度 计算机在处理数据都涉及到数据的转换和各种复杂运算,比如,不同单位换算,不同进制(如二进制十进制)换算等,很多除法运算不能除尽,比如10÷3=3.3333.....无穷无尽,而精度是有限的...当到达一定值自动开始使用科学计数法,并保留相关精度的有效数字,所以结果是个近似数,并且指数为整数。在十进制中小数有些是无法完整用二进制表示的。所以只能用有限位来表示,从而在存储时可能就会有误差。...,所以让我使用String字符串参数的构造方法创建BigDecimal。...在这一点上,有没有好奇的疑问。BigDecimal原理是什么?为什么它就没事?原理很简单。BigDecimal是不可变的,可以用来表示任意精度的带符号十进制数。

    2.4K30

    java面试官:Double为什么会丢失精度?解决方法?答出给1万月薪

    十进制科学计数法要求有效数字的整数部分必须在【1,9】区间内。...3.走进失真之精度 计算机在处理数据都涉及到数据的转换和各种复杂运算,比如,不同单位换算,不同进制(如二进制十进制)换算等,很多除法运算不能除尽,比如10÷3=3.3333.....无穷无尽,而精度是有限的...当到达一定值自动开始使用科学计数法,并保留相关精度的有效数字,所以结果是个近似数,并且指数为整数。在十进制中小数有些是无法完整用二进制表示的。所以只能用有限位来表示,从而在存储时可能就会有误差。...所以让我使用String字符串参数的构造方法创建BigDecimal。...在这一点上,有没有好奇的疑问。BigDecimal原理是什么?为什么它就没事?原理很简单。BigDecimal是不可变的,可以用来表示任意精度的带符号十进制数。

    23.1K30

    Java实现微信抢红包

    23.05 验证发出的红包总金额为:200.00 3.等值红包 场景:红包总额为100,群内人数为20人,需要每个人都为5块钱 /* * 等值红包 * */ public...:5.00 第20个人领取的红包金额为:5.00 等值红包验证发出的红包总金额为:100.00 但问题是如果200块,发214人,出现小数时需要保留2位小数出现精度损失导致总额不够200块如何解决?...,否则在不整除的情况下,结果是无限循环小数时,就会抛出以上异常 改为以上的 BigDecimal divide = count.divide(num,2,BigDecimal.ROUND_HALF_UP...BigDecimal 进行计算,保留2位小数后仍有精度损失,那么微信是如何解决的?...如果存在相同最大金额则重新计算 3.如果全部处理完还剩余钱怎么办? 将钱加到小红包里 4.如果钱是负数怎么办?

    7.2K20

    Java BigDecimal和double-BigDecimal转double-double转BigDecimal

    大家好,又见面了,我是你们的朋友全栈君。...(注释的内容表示此语句的输出) 第一行:事实上,由于二进制无法精确地表示十进制小数0.1,但是编译器读到字符串”0.1″之后,必须把它转成8个字节的double值,因此,编译器只能用一个最接近的值来代替...第四行:基于前面的分析,事实上这一行代码等价于第三行 结论: 1.如果你希望BigDecimal能够精确地表示你希望的数值,那么一定要使用字符串来表示小数,并传递给BigDecimal的构造函数...3.如果你不是很在乎是否完全精确地表示,并且使用了BigDecimal(double),那么要注意double本身的特例,double的规范本身定义了几个特殊的double值(Infinite,-Infinite...原因还是在于二进制无法精确地表示某些十进制小数,因此1023.99999999999999在编译之后的double值变成了1024。

    2.4K20

    Java实现微信抢红包

    :5.00等值红包验证发出的红包总金额为:100.00但问题是如果200块,发214人,出现小数时需要保留2位小数出现精度损失导致总额不够200块如何解决?...,结果是无限循环小数时,就会抛出以上异常改为以上的 BigDecimal divide = count.divide(num,2,BigDecimal.ROUND_HALF_UP)...;第212个人领取的红包金额为:0.93第213个人领取的红包金额为:0.93第214个人领取的红包金额为:0.93等值红包验证发出的红包总金额为:199.02那么出现不能整除的小数时,即便是BigDecimal...如果存在相同最大金额则重新计算3.如果全部处理完还剩余钱怎么办?将钱加到小红包里4.如果钱是负数怎么办?...当一个成员抢到红包后,就需要将抢到的红包金额从原来的红包中扣除,并将剩余的红包再次拆分成子红包发送到群聊中。抢夺红包的算法通常使用的是随机法或者二倍均值法。3.

    47410

    BigDecimal你了解吗,遇到过哪些坑?

    BigDecimal 想必我们都不陌生,涉及到金额的地方基本上都是用这个数据类型进行处理,那一般你用的是哪个数据类型?精度是如何处理的?有没有碰到过坑?...BigDecimal所创建的是对象故我们不能使用传统的+,-,×,÷等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。...2、阿里巴巴开发规范 1、构造与比较 【强制】BigDecimal的等值比较应使用compareTo()方法,而不是equals()方法。...说明:equals()方法会比较值和精度(1.0与1.00返回结果为false),而compareTo()则会忽略精度 2、浮点数之间的判断 【强制】浮点数之间的等值判断,基本数据类型不能用==来比较,...【强制】BigDecimal的等值比较应使用compareTo() 方法,而不是equals() 方法。

    9710

    阿里Java编程规约【四】OOP规约

    我的批注:相信有经验的开发者都应该知道字符串 String 比较肯定用的是 equals。 Java 世界里相等请用equals方法,== 表示对象相等,一般在框架开发中会用到。 8....9. 【强制】浮点数之间的等值判断,基本数据类型不能使用 == 进行比较,包装数据类型不能使用 equals 进行判断。...【强制】BigDecimal 的等值比较应使用 compareTo() 方法,而不是 equals() 方法。...说明:在方法执行抛出异常时,可以直接调用 POJO 的 toString() 方法打印其属性值,便于排查问题。 18....通俗地讲,一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没关系,那是你的事情,我就知道你提供的这么多public方法,我就调用这么多,其他的我一概不关心。

    57210

    double浮点数运算为啥会丢失精度?

    十进制科学计数法要求有效数字的整数部分必须在【1,9】区间内。...3.走进失真之精度 计算机在处理数据都涉及到数据的转换和各种复杂运算,比如,不同单位换算,不同进制(如二进制十进制)换算等,很多除法运算不能除尽,比如10÷3=3.3333.....无穷无尽,而精度是有限的...当到达一定值自动开始使用科学计数法,并保留相关精度的有效数字,所以结果是个近似数,并且指数为整数。在十进制中小数有些是无法完整用二进制表示的。所以只能用有限位来表示,从而在存储时可能就会有误差。...说到这里,是木有还有好奇的宝宝有疑问,BigDecimal的原理是啥?为啥它就没有问题呢?其实原理很简单,BigDecimal是不可变的,可以用来表示任意精度的带符号十进制数。...BigDecimal在处理的时候把十进制小数扩大N倍让它在整数上进行计算,并保留相应的精度信息。至于BigDecimal是怎么保存的可以翻阅一下源代码。

    4.4K20

    Java中的BigDecimal详解

    // 0.1 // 0.1 // 0.1 分析: 第一行:事实上,由于二进制无法精确地表示十进制小数0.1,但是编译器读到字符串"0.1"之后,必须把它转成8个字节的double值,因此,编译器只能用一个最接近的值来代替...第二行:BigDecimal能够正确地把字符串转化成真正精确的浮点数。 第三行:问题在于Double.toString会使用一定的精度来四舍五入double,然后再输出。会。...第四行:基于前面的分析,事实上这一行代码等价于第三行 结论: 1.如果你希望BigDecimal能够精确地表示你希望的数值,那么一定要使用字符串来表示小数,并传递给BigDecimal的构造函数。...3.如果你不是很在乎是否完全精确地表示,并且使用了BigDecimal(double),那么要注意double本身的特例,double的规范本身定义了几个特殊的double值(Infinite,-Infinite...原因还是在于二进制无法精确地表示某些十进制小数,因此1023.99999999999999在编译之后的double值变成了1024。

    58720

    新手小白学JAVA 正则表达式 包装类 自动装箱自动拆箱 BigDecimal

    大家好,又见面了,我是你们的朋友全栈君。 1 正则表达式Regex 1.1 概述 正确的字符串格式规则。 常用来判断用户输入的内容是否符合格式的要求,注意是严格区分大小写的。...1.编辑正则表达式 //身份证号的规律:一共是18位,前17位是数子,第18位有可能是数字,也有可能是X //String regex = "[0-9]{17}[0-9X...System.out.println(i0);//默认值为null //3.创建int类型对应的包装类Integer类型的对象--方式一 Integer...(double val) 将double转换为BigDecimal,后者是double的二进制浮点值十进制表示形式,有坑!...(a+""); BigDecimal bd2 = new BigDecimal(b+""); //3.通过BigDecimal的对象来调用其方法,实现精确运算

    30520

    阿里P8级架构师怎么处理电商业务中的数值计算的精度舍入溢出问题?

    以8+10%为例,为什么=8.8而不是8.1?一起读:8元钱,加上10%的小费,一共是8.8元。 最早的电子计算器并没有%,是后来加的。作为后续改进,它一定解决了计算场景中的常用痛点,而绝不是脑残。...我推测很可能是西方人计算折扣、小费、利息等常见场景。...BigDecimal乘法操作,返回值的scale是两个数的scale相加。...我们看一下Formatter类的相关源码,可以发现使用的舍入模式是HALF_UP(代码第11行): [watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMzNTg5NTEw...,size_1,color_FFFFFF,t_70#pic_center] 结果是一个负数,Long的最大值+1变为了Long的最小值 -9223372036854775808 显然发生溢出还没抛任何异常

    75940

    为什么阿里开发手册建议使用 BigDecimal 来进行浮点数的运算?

    大家好,我是 Guide。《阿里巴巴 Java 开发手册》中提到:“为了避免精度丢失,可以使用 BigDecimal来进行浮点数的运算”。...这篇文章,我就简单解释一下浮点数运算出现精度丢失的原因以及 BigDecimal的常见用法,希望对大家有帮助!...这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。...BigDecimal 的用处 《阿里巴巴 Java 开发手册》中提到:浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals 来判断。...想要解决这个问题也很简单,直接使用 BigDecimal 来定义浮点数的值,再进行浮点数的运算操作即可。

    1.2K10

    金融、支付行业的开发者不得不知道的float、double计算误差问题

    为什么浮点数 float 或 double 运算的时候会有精度丢失的风险呢?...我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用二进制精确表示。...JDK开发人员在很早就遇到了这个问题,并在JDK1.3起给我们提供了一种新的处理精确值的类BigDecimal,BigDecimal是标准的类,在编译器中不需要特殊支持,它可以表示任意精度的小数,并对它们进行计算...//......}等值比较问题《阿里巴巴 Java 开发手册》中提到:BigDecimal 使用 equals() 方法进行等值比较出现问题的代码示例:BigDecimal a = new BigDecimal...每个 BigDecimal 实例都需要维护其精度和标度等信息,这会导致内存开销增加。不可变性:BigDecimal 是不可变类,每次进行运算或修改值时都会生成一个新的 BigDecimal 实例。

    12700
    领券