当前位置: 首页 > 面试题库 >

Java中有与toPrecision()等效的东西吗?

松阳泽
2023-03-14
问题内容

在将算法从JavaScript移植到Java时,我遇到了需要替换JavaScript的toPrecision()的问题。问题是我不知道数字的大小是多少,所以我不能使用具有正确格式的简单NumberFormat。

是否有提供类似功能的标准类?

编辑这是我想出的:

   double toPrecision(double n, double p) {
        if (n==0) return 0;

        double e = Math.floor(Math.log10(Math.abs(n)));
        double f = Math.exp((e-p+1)*Math.log(10));

        return Math.round(n/f)*f;
    }

原则上,它做对了,但是舍入错误完全毁了它。例如, toPrecision(12.34567, 3)返回12.299999999999997

编辑2此版本非常适合12个测试用例中的11个…

   double toPrecision(double n, double p) {
        if (n==0) return 0;

        double e = Math.floor(Math.log10(Math.abs(n)));
        double f = Math.round(Math.exp((Math.abs(e-p+1))*Math.log(10)));
        if (e-p+1<0) {
            f = 1/f;
        }

        return Math.round(n/f)*f;
    }

但是toPrecision(0.00001234567, 3)仍然返回1.2299999999999999E-5而不是1.23E-5


问题答案:

使用BigDecimalsetScale()方法来设置精度

BigDecimal bd = new BigDecimal("1.23456789");
System.out.println(bd.setScale(3,BigDecimal.ROUND_HALF_UP));

输出量

1.235

看到

  • IDEone演示


 类似资料:
  • 问题内容: 我有一个byte [],想将其复制到另一个byte []中。也许我在这里展示了我的简单“ C”背景,但是在Java字节数组中是否有等同于memcpy()的东西? 问题答案: 您可以尝试或使用阵列功能,在像类。两者都应在引擎盖下为您提供本机性能。 Arrays.copyOf可能对可读性有利,但仅在Java 1.6中引入。

  • 问题内容: 将几个存储过程从MySQL转换为Microsoft SQL Server。一切都进行得很好,除了一个过程使用了MySQL函数。我似乎无法在MS-SQL中找到与之等效的东西。 有谁知道在MS-SQL上的有效等效项? 问题答案: SQL Server 2005和更高版本具有HashBytes()函数。

  • 问题内容: Perl的正则表达式具有反斜杠序列: \ K 这出现在perl 5.10.0中。匹配的左侧的任何内容均不包含在中,如果在替换中使用该模式,则不会替换任何内容。这使您可以代替 或进行编写。 助记符: 保持 。 Python中有什么等效的东西吗? 问题答案: 建议使用的Python模块替代品具有此功能,可从名称下获得。其规范的源代码存储库和错误跟踪器位于bitbucket中。 这是在201

  • 问题内容: Java世界中有与WPF和MVVM类似的东西吗? 问题答案: 您看过eFace吗? eFace是Java中的XAML / WPF解决方案。现在可以下载第一版:http : //www.soyatec.com/eface/installation/。

  • 问题内容: 就像在Java 8中(某种程度上)等同于Scala的类型一样,是否也等同于Scala的类型? 问题答案: Java 8 没有类型,因此您需要自己创建一个或使用一些第三方库。 您可以使用新类型来构建这样的功能(但请阅读此答案的结尾): 用例示例: 回顾起来,基于基础的解决方案更像是一个学术实例,而不是推荐的方法。一个问题是对“空” 的处理,这与“任一个”的含义相矛盾。 以下代码显示了一个

  • 问题内容: 基本上,我希望每10毫秒调用一次函数。 如何在Java中实现? 问题答案: 您可能想看看Timer。