浮点数位模式和实体模式的转换

本文介绍了浮点数位模式和实体模式之间的转换方法,通过C语言实现,包括位模式到浮点数的转换和浮点数到位模式的转换。涉及union和类型转换,展示了如何在内存中直接操作二进制表示来理解浮点数的存储形式。

1、概念:

     浮点数的位模式是计算机存储浮点数的二进制数,比如: float f = 12345; 12345是f的实体模式,f的位模式为0x4640e400 ;

     double d= 12345; 12345是d的实体模式,d的位模式为0x40c81c8000000000;

     机器代码不包含关于字段声明或字段名字的信息,即缺乏类型信息。在调试时,可以通过反汇编来查看某个数据的位模式(即二进制表示),不管数据类型怎么转换,位模式都不会改变,即不同数据类型是位模式的表现形式。

 

2、转换方法

     方法一:

     

### Java实体类中设置BigDecimal属性以保留两位小数 在Java实体类中处理`BigDecimal`类型的属性并确保其始终保留两位小数,可以采用多种方式来实现这一目标。以下是几种常见且有效的做法: #### 方法一:使用自定义序列化器 通过创建一个专门用于序列化的工具类,在对象转换成JSON字符串时自动调整`BigDecimal`的精度。 ```java import com.fasterxml.jackson.databind.annotation.JsonSerialize; import custom.serializers.BigDecimalSerializer; public class Product { @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal price; // Getters and Setters... } ``` 这种方法适用于前后端交互场景下,当需要将对象转为JSON格式发送给前端或其他服务消费方时生效[^4]。 #### 方法二:利用业务逻辑层统一处理 可以在每次获取或修改该字段之前/之后都调用一次设定好的方法来进行数值修约操作。 ```java public class OrderItem { private BigDecimal amount; public void setAmount(BigDecimal amount){ this.amount = Optional.ofNullable(amount).orElse(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP); } public BigDecimal getAmount(){ return Optional.ofNullable(this.amount).orElse(BigDecimal.ZERO).setScale(2,RoundingMode.HALF_UP); } // Other properties & methods ... } ``` 这种方式能够保证无论是在保存到数据库前还是读取出来展示给用户的时候都能保持一致的小数位数[^3]。 #### 方法三:结合框架特性完成自动化配置 对于某些特定的应用程序开发环境而言(比如Spring Boot),还可以借助于框架本身提供的功能来做全局性的参数绑定校验以及数据清洗工作。 ```yaml spring: jackson: serialization: WRITE_BIGDECIMAL_AS_PLAIN: true ``` 配合上合适的验证注解如`@Digits(integer=10,fraction=2)`等,则可以让整个项目中的所有涉及金额计算的地方都不再担心因为浮点误差而导致的问题发生。 以上三种方案各有优劣,可以根据实际应用场景灵活选用最适合自己团队技术栈的方式去解决问题。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值