Scala中如何将BigDecimal类型转换为BigInt类型?
Scala BigDecimal转BigInt正确实现方案
报错原因
- 第一次调用
new BigInt(x)报错:Scala的BigInt类主构造器仅支持接收java.math.BigInteger类型入参,传入BigDecimal类型不匹配 - 第二次调用
BigInt(x)报错:BigInt伴生对象的apply方法没有接收BigDecimal类型参数的重载,无法匹配入参
正确转换方法
方法1:直接截断小数部分转换(向零取整)
Scala标准库的BigDecimal类自带toBigInt方法,会直接丢弃小数部分,只保留整数位:
val x: BigDecimal = 2.335656787776 val y: BigInt = x.toBigInt // 输出结果:2
说明:该方法不会做四舍五入,比如BigDecimal(2.999).toBigInt结果为2,BigDecimal(-1.8).toBigInt结果为-1
如果当前操作的是Java的BigDecimal实例,可以先调用toBigInteger方法转成Java的大整数类型,再封装为Scala的BigInt:
import java.math.BigDecimal val x: BigDecimal = new BigDecimal("2.335656787776") val y: BigInt = BigInt(x.toBigInteger)
方法2:按指定舍入规则转换后转BigInt
如果需要先对小数部分做四舍五入、向上取整等处理再转换,可以先调用setScale设置舍入规则:
import java.math.RoundingMode val x: BigDecimal = 2.635656787776 // 示例:四舍五入保留0位小数后转BigInt val y: BigInt = x.setScale(0, RoundingMode.HALF_UP).toBigInt // 输出结果:3
常用舍入模式参考:
RoundingMode.HALF_UP:四舍五入RoundingMode.DOWN:直接截断小数(和toBigInt默认行为一致)RoundingMode.UP:向绝对值更大的方向取整RoundingMode.CEILING:向正无穷方向取整RoundingMode.FLOOR:向负无穷方向取整
内容的提问来源于stack exchange,提问作者Shivam Sahil
相关产品推荐
相关产品推荐

