有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!


共 (1) 个答案

  1. # 1 楼答案

    你。。。有电话号码。。。存储作为替身

    你不能那样做

    双打给你错误的答案。它们并不精确。计算机不是魔法,它们有局限性。双精度存储在64位中。所以,根据基本数学,最多有2^64个唯一的双精度。没有比这更多的了。2^64是一个很大的数字,但与负无穷大和正无穷大之间存在的数字相比,这算不了什么,正无穷大比2^64大两个整数级

    它的工作方式如下:有2^64(略低于这个数字)“受祝福的”数字。这些数字可以存储为两倍。所有其他数字(非受祝福的)都是静默的四舍五入到最近的受祝福数字

    稍微简单一点,这些受祝福的数字并不是平均分布的。接近1.0(和-1.0)时,有很多em。当你离它越远(比如说,几百万)时,em就越少

    这意味着你永远不应该把任何ID(“数字”比如“添加1”是没有意义的。在电话号码中添加1是你永远不会做的事情)作为一个替身来存储。您将随机将您的号码从12345679更改为12345678,绝对没有任何警告

    这也意味着“将双精度渲染为字符串”很棘手。因为例如,0.3不受祝福,所以它实际上存储为0.29999999546。这意味着当你把一个double渲染成一个字符串时,你必须告诉java你需要多高的精度。所以,你不需要做Double.toString(...),你需要做String.format("%.2f", theNumber),告诉java:我并不是在寻找逗号后超过2位的精度

    所以,概括一下:

    1. 你的设计从根本上被破坏了,除非你更新数据库,停止将电话号码存储为双精度,否则无法修复。应该将其存储为字符串
    2. 对于非电话号码目的,在将double呈现为string时,正确的方式是String.format("%.2f", theNumber),其中“2”表示需要小数分隔符后的位数