如何检查 double 是否最多有 n 位小数?

2023-11-27

目前我有这个方法:

static boolean checkDecimalPlaces(double d, int decimalPlaces){
    if (d==0) return true;

    double multiplier = Math.pow(10, decimalPlaces); 
    double check  =  d * multiplier;
    check = Math.round(check);      
    check = check/multiplier; 
    return (d==check);      
}

但这种方法失败了checkDecmialPlaces(649632196443.4279, 4)可能是因为我对以 2 为底的数字进行以 10 为底的数学运算。

那么如何才能正确地进行这项检查呢?

我想获取双精度值的字符串表示形式,然后使用正则表达式进行检查 - 但这感觉很奇怪。

EDIT:感谢所有的答案。在某些情况下,我确实得到了双倍,对于这些情况,我实施了以下操作:

private static boolean checkDecimalPlaces(double d, int decimalPlaces) {
    if (d == 0) return true;

    final double epsilon = Math.pow(10.0, ((decimalPlaces + 1) * -1));

    double multiplier = Math.pow(10, decimalPlaces);
    double check = d * multiplier;
    long checkLong = (long) Math.abs(check);
    check = checkLong / multiplier;

    double e = Math.abs(d - check);
    return e < epsilon;
}

我改变了round到截断。看来计算是在round过多地增加了不准确性。至少在失败的测试用例中是这样。
正如你们中的一些人指出的,如果我可以得到我应该使用的“真实”字符串输入BigDecimal检查,所以我已经做了:

BigDecimal decimal = new BigDecimal(value);
BigDecimal checkDecimal = decimal.movePointRight(decimalPlaces);
return checkDecimal.scale() == 0;

The double我得到的值来自读取 Excel 文件的 Apache POI API。我做了一些测试,发现虽然API返回double当我立即格式化数字单元格的值时,我可以获得准确的表示doubleDecimalFormat:

DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setMaximumIntegerDigits(Integer.MAX_VALUE);
// don't use grouping for numeric-type cells
decimalFormat.setGroupingUsed(false);
decimalFormat.setDecimalFormatSymbols(new DecimalFormatSymbols(Locale.US));
value = decimalFormat.format(numericValue);

这也适用于无法以二进制格式精确表示的值。


测试失败,因为您已经达到了二进制浮点表示的精度,大约为 16 位IEEE754双精度。将 649632196443.4279 乘以 10000 将截断二进制表示形式,导致随后舍入和除法时出错,从而使函数结果完全无效。

欲了解更多详情,请参阅http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

更好的方法是检查是否n+1小数位数低于某个阈值。如果d - round(d)小于epsilon (see limit), 的十进制表示d没有有效的小数位。同样如果(d - round(d)) * 10^n小于epsilon, d 最多可以有n重要的地方。

Use 乔恩·斯基特's DoubleConverter检查以下情况d不够准确,无法保存您要查找的小数位。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何检查 double 是否最多有 n 位小数? 的相关文章

  • “JSONArray 文本必须在 null 的第 1 个字符处以 '[' 开头”

    只是想知道这个错误可能意味着什么 我从下面的代码中得到它 try JSONArray jArray new JSONArray result for int i 0 i
  • Selenium:将 Internet Explorer 中的文件下载到指定文件夹,无需直接链接,无需 Windows 窗体,无需 AutoIt 或 Robot

    我经常遇到一个问题 如何在 IE 中下载文件 与 Firefox 的 Chrome 不同 您不能只指定所需的文件夹 所有文件都会下载到该文件夹 您还需要与本机 Windows 表单等进行交互 有多种选项 例如使用 AutoIt 使用键盘命令
  • 是否可以使用 Java 读写 Parquet,而不依赖 Hadoop 和 HDFS?

    我一直在寻找这个问题的解决方案 在我看来 如果不引入对 HDFS 和 Hadoop 的依赖 就无法在 Java 程序中嵌入读写 Parquet 格式 它是否正确 我想在 Hadoop 集群之外的客户端计算机上进行读写 我开始对 Apache
  • Hashset - 创建 Set 后使对象相同

    如果我们在 HashSet 中添加两个不同的对象 可变的 然后通过调用 setter 更改对象的值 使它们相同 则大小仍然是 hashSet 的 2 我无法理解其原因 public static void main String args
  • java 中的梵文 i18n

    我正在尝试使用来自互联网的示例 ttf 文件在 java 中使用 i18n 进行梵文 印地文 我可以加载资源包条目 还可以加载 ttf 并设置字体 但它不会根据需要呈现 jlabel 它显示块代替字符 如果我在 Eclipse 中调试 我可
  • 如何准确判断 double 是否为整数? [复制]

    这个问题在这里已经有答案了 具体来说 在 Java 中 我如何确定double是一个整数 为了澄清 我想知道如何确定 double 实际上不包含任何分数或小数 我主要关心的是浮点数的性质 我想到的方法 以及我通过谷歌找到的方法 基本上遵循以
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 在 Eclipse 3.5 上安装旧版 TestNG 插件时出现问题

    我正在尝试在 eclipse 3 5 上安装 TestNG 5 11 并获得以下信息 eclipse buildId unknown java version 1 6 0 19 java vendor Sun Microsystems In
  • 获取Android库中的上下文

    我正在编写一个 Android 应用程序 它的一些功能封装在内部库中 但是 要使此功能发挥作用 库需要一个应用程序上下文的实例 为图书馆提供这种上下文的最佳方式是什么 我看到了一些选择 但没有一个有吸引力 Have my library c
  • Maven WebApp META-INF context.xml

    我正在使用 Maven 3 并且尝试在 webapp 文件夹下添加 META INF 文件夹 所以我正在尝试执行以下操作 src main webapp META INF context xml WEB INF 下面是我的 POM 文件
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • 如何在Netbeans中设置JList的ListModel?

    我在 Netbeans IDE 的帮助下设计了一个 Swing GUI 该 GUI 包含一个 JList 默认情况下 它使用 QAbstractListModel 将其作为 JList 构造函数中的参数传递以创建该 JList 我想在 Ne
  • 如何让“循环”泛型在 Java 中工作?

    我在编译以下涉及一些泛型的代码时遇到错误 public abstract class State
  • 避免 @Secured 注释的重复值

    我正在尝试使用以下方法来保护我的服务方法 Secured如下 public interface IUserService Secured ROLE ROLE1 ROLE ROLE2 ResponseEntity saveUser Creat
  • 使用 Guava Ordering 对对象列表进行多条件排序

    我有一个类无法实现可比较 但需要根据 2 个字段进行排序 我怎样才能用番石榴实现这一目标 假设班级是 class X String stringValue java util Date dateValue 我有一个清单 List
  • Spring - 如何在不匹配列名的情况下使用 BeanPropertyRowMapper

    我正在开发一个应用程序 该应用程序已使用行映射器从纯 JDBC 转换为 Spring 模板 我遇到的问题是数据库中的列与属性名称不匹配 这阻止我使用BeanPropertyRowMapper容易地 我看到一些关于在查询中使用别名的帖子 这会
  • Proguard 正在破坏我的清洁度。 Gson 和泛型

    我有一个从持久性加载信息的函数 我只是以一种非常简单的方式告诉它的类型 该类称为SharedPreferencesHelper kt所以它是一个真正的生活问题解决者 fun
  • 检查按钮是否可用?如果没有,请等待 5 秒钟,然后再次检查?

    基本上我想看看此刻是否可以单击按钮 如果没有我想再试一次 所以我需要某种 goto 函数来返回到代码的前一行 尽管我怀疑我写得非常糟糕 但它本来可以做得更容易 try driver findElement By xpath button i
  • Firebase:用户注册后如何进行电话号码验证?

    所以我知道我可以使用电子邮件验证或电话号码验证 但我想做的是在用户注册或登录后进行电话号码验证 如何连接这两种身份验证方法 最后 Firebase中是否有一个函数可以检查用户是否通过电话号码验证 谢谢 即使用户已通过身份验证 您仍然可以使用
  • 如何在J2ME中获取数字的幂[重复]

    这个问题在这里已经有答案了 可能的重复 J2ME power double double 数学函数实现 https stackoverflow com questions 2076913 j2me powerdouble double ma

随机推荐

  • 如果数组中的所有对象都有属性值,则返回 true

    我有一个对象数组 如下所示 scope objectArray Title object1 Description lorem Value 57 Title object2 Description ipsum Value 32 Title
  • 在 sqlalchemy 中使用计算列更新表

    我正在使用 SQLalchemy 在旧版 MSSQL 数据库中工作 我有一个声明性映射 该数据库有几个表 其中包含计算列 我可以很好地阅读它们 但是 当然 写入计算列不起作用 但是 当我创建并尝试保存 ORM 对象时 SQLAlchemy
  • 活动的 AlertDialog 样式按钮

    我有一个活动 底部有一个 保存 和 取消 按钮 在 AlertDialog 中 按钮显示在某种样式化的容器视图内 我怎样才能让我的活动中的按钮具有相同的外观 具体来说 我如何应用 AlertDialog 中按钮容器视图的样式来表示我的 Ac
  • 在 JavaScript 中将字符串转换为变量名

    我一直在寻找解决方案 但找不到任何有效的解决方案 我有一个变量叫做onlyVideo onlyVideo 字符串被传递到函数中 我想设置变量onlyVideo在函数内部作为某种东西 我怎样才能做到这一点 有很多变量可以被调用到函数中 所以我
  • Android 输入文本对话框

    当用户单击Button在我的应用程序中 打印在SurfaceView 我想要一条短信Dialog出现 我想将结果存储在String 我想要文字Dialog覆盖当前屏幕 我怎样才能做到这一点 听起来是一个使用的好机会警报对话框 尽管看起来很简
  • OpenCV 2.2 Windows XP MinGW 构建在namedWindow、imshow 上崩溃

    我下载了适用于 Windows 的最新 OpenCV 2 2 源代码 并在 CMake 2 8 的帮助下使用 MinGW 4 4 1 在 Windows XP 上进行编译 一切都很顺利 编译 mingw32 make 和安装 mingw32
  • 调试:为多列创建多个滞后的函数 (dplyr)

    我想创建多个变量的多个滞后 所以我认为编写一个函数会很有帮助 我的代码抛出警告 将向量截断为长度 1 和错误结果 library dplyr time lt c 2000 2009 2000 2009 x lt c 1 10 10 19 i
  • 将 HTML 转换为 XML

    我有数百个 HTML 文件需要转换为 XML 我们使用这些 HTML 为应用程序提供内容 但现在我们必须以 XML 形式提供这些内容 HTML 文件包含 表格 div 图像 p b 或强标记等 我用谷歌搜索并找到了一些应用程序 但我还无法实
  • 是否有比使用 C++ 的 FindFirstFile/FindNextFile 更快的枚举文件夹替代方法?

    我需要获取文件夹内子文件夹的所有路径 使用 WinAPI 和 C 到目前为止 我发现的唯一解决方案是递归调用查找第一个文件 查找下一个文件但在层次结构较深的文件夹上执行此操作需要花费大量时间 所以我想知道 只是为了获取文件夹名称 是否有更快
  • 有没有比忙等待更智能的方法来检查 System.Net.WebClient.DownloadFileAsync() 的下载完成情况?

    我正在使用 System Net WebClient DownloadFileAsync 下载文件 使用异步版本的唯一原因是显示下载进度 在达到 100 之前 我的代码执行可能不会继续 目前我正在使用忙等待 参见代码 但我想知道是否有更聪明
  • fgetpos() 行为取决于换行符

    考虑这两个文件 file1 txt Windows 换行符 abc r n def r n file2 txt Unix 换行符 abc n def n 我注意到对于 file2 txt 通过以下方式获得的位置fgetpos没有正确增加 我
  • 可移动/可拖动

    这是我更新和修改的脚本 它完全可以工作 除了我想通用它 观察 我怎样才能做到这一点 这样我就不必这样做function e BOX Draggable elemen e target e srcElement elementDraggabl
  • Jenkins:在 MultiJob 中共享变量

    我使用 Jenkins 进行测试 构建 因此我使用以下配置创建了一个 MultiJob 项目 Test Job 建立工作 安装工作 MultiJob 从 Master Jenkins 启动 但其他作业从其他 Node 启动 构建作业执行创建
  • DVCLAL 的所有可能值的列表是什么?

    当我遇到这个函数时 我正在阅读 SysUtils function ALR Pointer var LibModule PLibModule begin if MainInstance lt gt 0 then Result Pointer
  • sql触发器打印消息

    我是在数据库中使用触发器的新手 我创建了一些对我来说非常有效的触发器 除了当我尝试创建一个在删除行后显示一条消息的触发器时 我尝试使用这段代码 ALTER TRIGGER mycustomerTrigger AFTER delete ON
  • 如何在 git 中查看传入的提交? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 Git 如何在本地和远程之间查找修改过的文件 如何在 git 中查看传入的提交 或者甚至更好 看看我刚刚说的git fetch git pulled Edit 为了澄清这个问题 有人告诉我 为了
  • 为什么 JVM 不缓存 JIT 编译的代码?

    Sun 的规范 JVM 实现对字节码应用了一些相当复杂的优化 以便在代码运行几次后获得接近本机的执行速度 问题是 为什么不将此编译后的代码缓存到磁盘以供后续使用同一函数 类时使用 按照目前的情况 每次执行程序时 JIT 编译器都会重新启动
  • 用于图像去模糊的维纳滤波器

    我正在尝试实现维纳滤波器来对模糊图像执行反卷积 我的实现是这样的 import numpy as np from numpy fft import fft2 ifft2 def wiener filter img kernel K 10 d
  • 使用 JfreeChart 动态向 XYSeries 添加点

    我在向 XYSeries 添加点时遇到问题 我有两节课 一是Sample 它有一个main方法 另一个类是JfreeChart 它有JfreeChart代码 在我的Sample类我有一个二维数组sample row 2 最初有 10 行 然
  • 如何检查 double 是否最多有 n 位小数?

    目前我有这个方法 static boolean checkDecimalPlaces double d int decimalPlaces if d 0 return true double multiplier Math pow 10 d