当前位置: 首页 > 知识库问答 >
问题:

获取存储的实际数字

田鸿彩
2023-03-14

我有一个项目,使用泰勒级数创建一个科学计算器。此外,我正在分析IEEE 754标准浮点系统的数字。

在我的计算器中,用户选择要单精度还是双精度:我使用浮点和双变量,然后按照ieee 754规范分析数字。

如果用户想要双精度,分析如下:

double analyze=3.45
BigDecimal bd=new BigDecimal(analyze) 

这给了我

3.45000000000000017763568394002504646778106689453125

>

  • 这个数字是以二进制格式存储在pc内存中的实际数字吗?

    如果不是,我有没有办法得到存储的数字的真实值?

    还有,为什么会发生这种情况?

    双重分析=0.5
    BigDecimal db=new BigBecimal(分析)

    它只打印< code>0.5 -为什么我会丢失有效数字?

    有人能告诉我为什么会这样吗

            BigDecimal one=new BigDecimal(0.1);
            BigDecimal five=one.multiply(new BigDecimal(5)) ;
            System.out.println("5 times 0.1 is "+" "+ five);
    
            System.out.println("But the 0.5 in BigDecimal is " + " "+ new BigDecimal(0.5));
    

    通过运行该函数,可以得到5倍,0.1是0.50000000000000002775756156289135105907917022750078125,但BigDecimal中的0.5是0.5

  • 共有3个答案

    傅正豪
    2023-03-14

    >

  • 是的。BigDecimal(双精度)构造函数“将双精度转换为BigDecimal,BigDecimal是双精度二进制浮点值的精确十进制表示形式。”BigDecimal toString方法显示确切的值。

    不适用的

    0.5可精确表示为双精度。BigDecimal(0.5)结果具有未缩放值5和缩放值1。它满足BigDecimal toString条件以显示无指数。小数点后的位数等于刻度1。

    您的示例代码:

        BigDecimal one=new BigDecimal(0.1);
        BigDecimal five=one.multiply(new BigDecimal(5)) ;
    

    在使用BigDecimal双构造函数时出现问题,除非您正在探测双表示。0.1不能精确地表示为双精度,因此您的“1”不完全是0.1,即使<code>BigDecimal(“0.1”)

    更一般地,双精度的精确值总是具有a/(2**b)的形式,其中ab是整数,"**"表示指数。(a*5**b)/(10**b)具有相同的值,并且可以完全表示为缩放为b的BigDecimal。

  • 戚明朗
    2023-03-14

    >

  • 是的,3.45000000000000017763568394002504646778106689453125是将数字“3.45”转换为通用双精度格式时存储在双精度中的实际值。

    这才是真正的价值。

    你没有展示你打印0.5的方法。据我回忆,Java中的一种常见显示机制只是在可能的情况下,根据需要打印尽可能多的数字来准确表示值。它不打印尾随零,因为它们是多余的。

    你可能会想,“如果只打印了.5,我怎么知道数字是.5000000000而不是.5000000001之类的?”答案是,如果数字不同于0.5,将打印更多数字,因为显示机制被定义为这样做。因此,你可以相信“.5”的意思是“5”,不多也不少。

    如果这是一个学校项目,那么你可能不需要担心3.45被表示为一个稍微不同的值。只需继续使用双精度值进行计算即可。

    此外,泰勒级数对于真正的计算器来说是一个糟糕的选择,因为它们被设计成在一个点附近是精确的,但是你会想要一个在一个区间上是精确的级数。还有其他一些级数可以更好地分散它们的误差,因此它们需要更少的项来得到精确的结果。如果泰勒级数被建议作为学校项目的一部分,我只会使用它。

  • 惠翰藻
    2023-03-14

    1.我想问你,这个数字是以二进制格式存储在pc内存中的实际数字吗??

    是的。

    2.if这不是任何方法我可以有真正的价值的数字存储

    是的,所以没问题。

    1. 它只打印我-

    你没有;0.5 是以二进制格式存储的确切数字。

     类似资料:
    • 我刚开始使用firebase作为我的Flatter应用程序的后端,我有一个问题:如何将两个文档链接在一起,同时获取这两个数据。例如,我有一个用户集合和一个帖子集合。我如何链接这两个文档,当我获取帖子数据时,我也会在相同的响应中获取用户数据

    • (我不计算单词可寻址的机器,也不计算Alpha(字节可寻址但缺少字节加载/存储指令)。我指的是ISA本身支持的最窄的存储指令。) 在我的研究中,当回答现代x86硬件不能将一个字节存储到内存中吗?时,我发现Alpha AXP省略字节存储的原因是假设它们将被实现为真正的字节存储到缓存中,而不是包含字的RMW更新。(因此,它会使L1d缓存的ECC保护更加昂贵,因为它需要字节粒度而不是32位)。 我假设提

    • 所以,我想让用户同时上传多个图像到firebase存储。我已经成功地完成了这部分,但现在我想要取回图像。一开始,我上传一个图像给每个用户,并将图像id保存到实时数据库中,这样就很容易通过图像id检索回图像。但是现在我如何为每个用户保存多个图像到实时数据库我不能使用相同的子名,因为它将被替换为旧的。有什么想法吗?? 上载图像并在实时数据库上设置id: 我的firebase数据库:

    • 问题内容: 我想获取运行我的应用程序的设备的实际屏幕高度。为此,我尝试以下操作: 我使用模拟器运行的设备的屏幕宽度为1080像素,屏幕高度为1920像素。宽度可以正确显示(1080像素),但根据应用程序,高度仅为1776像素。我需要什么来使我的应用显示正确的屏幕高度?是让屏幕高度的好方法? 问题答案: 看到这个答案 如果您的API级别> 13,请在活动时尝试 如果您不在活动中,则可以通过WINDO

    • 问题内容: 我得到一个JFrame,我想显示一个带有边框的JLabel,其填充可能为50px。当我将JFrame的大小设置为750、750并将JLabel的大小设置为650、650并将位置设置为50、50时,它显示为奇怪……这是我的代码: 因此,我认为顶部的标题栏也包含在大小中。在图形中,您可以使用。现在,Swing / JFrame有类似的东西吗? 问题答案: 首先获取由帧修剪的像素。 另一种更

    • 问题内容: 我在项目中使用Spring Data JPA仓库已有一段时间了,我知道以下几点: 在存储库接口中,我们可以添加类似的方法(假设和是域对象中的字段)。 然后,Spring通过在运行时(在应用程序运行期间)实现上述存储库接口方法来提供实现。 我对它的编码方式很感兴趣,并查看了Spring JPA源代码和API,但是找不到以下问题的答案: 如何在运行时生成存储库实现类以及如何实现和注入方法?