c# - C# strange precision lost int to float and backwards
问题描述
curious thing happen when tried to cast from int to float and backwards.
Primitive example code:
int val = 28218681; // val=28218681
float fVal = (float) val; // fVal=2.821868E+07
int val2 = (int) fVal; // val2=28218680
May somebody explain why conversion lost rightmost "1" from value?
Thank You Marius
解决方案
这是对现已删除的答案的评论:
整数28218681
可以用二进制写成1101011101001010100111001
. 请注意,需要 25 位数字。单精度的“尾数”只有 24 位(包括隐式前导 1 位)。24 小于 25。精度丢失。单精度表示仅通过其前 24 位二进制数字“记住”一个数字。这对应于大约 7-8 个十进制数字。大致。整数28218681
只有 8 位,所以问题就来了。
吸取的教训是,使用足够“宽”的类型以提供所需的精度。例如,一个double
精度数可以保存一个数字的前 16 个小数位。
这与使用二进制还是十进制格式的讨论无关。请注意,如果提问者使用decimal32
而不是binary32
(的另一个名称float
),他将遇到完全相同的问题!
推荐阅读
- java - Spring Boot @Cacheable stopped working after I moved method to the same class
- node.js - how to query and update a nested array objects using Mongoose in Node js using the object id of the object in the nested array
- python - want to concat the directory and file name
- javascript - Do something if element children has url link like
- css - Can't select specific child div
- c - makefile 中不需要的环境变量
- angular - How to assign to variable true in pipe?
- r - 在dplyr中用rep扩展数据框?
- import - Manual function module transport into another system existing function group?
- ruby-on-rails - How to get next n records in ruby?