首页
学习
活动
专区
工具
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.BigDecimalBigDecimal...一个对象,代表着不变,任意精度带符号十进制数字,我们要使用该对象方法来进行加减乘除操作 原理 既然十进制小数转成二进制会损失精度,那么把十进制小数扩大成整数再转成二进制则会保持精度了 2....System.out.println(num2); // 0.1 因为浮点数并不是一个准确,而String类型就确定 2.2 常用方法 方法 描述 abs() 返回一个绝对BigDecimal...比较用compareTo,而equals要求scale()即小数位数相同 ArithmeticException常见算数异常 3.

1.1K10

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

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

47020

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

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

2K10

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

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

85820

阿里云面试:为什么建议使用 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。

40010

BigDecimal知识回顾

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

76620

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

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

19.2K30

Double为什么会丢失精度

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

2.2K30

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.1K20

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.3K20

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.

32110

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

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

50210

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

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

3.6K20

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。

49920

新手小白学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对象来调用其方法,实现精确运算

28220

公司同事用float和double,结果导致..

也就是说,我们传递给计算机十进制数据,但是计算机需要先把我们给数据转换成二进制数据,因为不能直接识别十进制数据,这时候,2.0 十进制数据,转换成二进制数据,而1.4呢?...这个时候就有人问了,定义 float 类型为 1.4 时候为什么不是 1.399999999呢?这就是不进行浮点计算时候,在十进制里浮点数能正确显示。...Java程序:使用 BigDecimal 来定义,再进行浮点数运算操作 BigDecimal Java 在 java.math 包中提供API类,用来对超过16位有效位数进行精确运算 使用...BigDecimal 要注意东西 1.BigDecimal(double) 创建一个具有参数所指定双精度对象 但是这种类型都不推荐使用为什么不推荐使用,我们来试一下 BigDecimal...这就是为什么有些面试官在面试基础时候,很多次会问,float 和 double 都会丢失精度,BigDecimal 会丢失精度么?为什么

76140

(四)改掉这些坏习惯,还怕写不出健壮代码?

源码第 806 ,如下图所示,很显然 BigDecimal 构造不会判断传入 val 是否为空,所以会出现空指针异常。...目前没有出现问题,那只能算庆幸,不过终究个定时炸弹。切记调用 BigDecimal 构造时,请勿传入 null 。...= 0,那么如下表达式则满足,会输出交易金额错误。 ? 为什么呢?...禁止使用 double 直接参与金额运算,会出现意想不到结果。 浮点数采用“尾数+阶码”编码方式,类似于科学计数法“有效数字+指数”表示方式。 二进制无法精确表示大部分十进制小数。...—— 阿里开发手册 3. 那些看似顺眼代码,或者线上跑着代码,未必就没问题,只是没有走到异常分支上去,随着时间推移,定时炸弹迟早会爆,定期审查代码,以及充分测试是非常必要。

41430

阿里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 显然发生溢出还没抛任何异常

70240

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

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

1.1K10
领券