为什么有些数字在存储为浮点数时会失去准确性?
例如,十进制数9.2可以精确地表示为两个十进制整数(92/10)的比率,两者都可以用二进制(0b1011100/0b1010)精确表示.但是,存储为浮点数的相同比率永远不会完全等于9.2:
32-bit "single precision" float: 9.19999980926513671875
64-bit "double precision" float: 9.199999999999999289457264239899814128875732421875
Run Code Online (Sandbox Code Playgroud)
这样一个看似简单的数字如何在64位内存中表达"太大" ?
我的目标是简单地将诸如"1.2"的字符串转换为科学记数法而不增加额外的精度.问题是我总是在输出结束时得到多余的0.
>>> input = "1.2"
>>> print '{:e}'.format(float(input))
1.200000e+00
Run Code Online (Sandbox Code Playgroud)
我正在试图找出如何获得公正1.2e+00.我意识到我可以在我的格式语句中指定精度,但我不想不必要地截断更长的字符串.我只是想压制训练0.
我尝试过使用Decimal.normalize(),它适用于所有情况,除了e <2.
>>> print Decimal("1.2000e+4").normalize()
1.2E+4
>>> print Decimal("1.2000e+1").normalize()
12
Run Code Online (Sandbox Code Playgroud)
所以这更好,除了我不想要12,我想要1.2e + 1.:P
任何建议将不胜感激!
编辑: 为了澄清,输入值已经适当地舍入到预定长度,现在是未知的.我试图避免重新计算适当的格式精度.
基本上,我可以输入值"1.23"和"1234.56",它应该是"1.23e + 0"和"1.23456e + 3".
我可能只需要检查输入字符串的长度并使用它来手动指定精度,但我想检查并确保我没有遗漏可以阻止指数格式任意添加0的东西.
我知道如何格式化double以仅保留可用的小数位(DP),最多只能保留一定数量的DP.此示例最多可保留4个DP.
double d = 1.0;
DecimalFormat df = new DecimalFormat("#.####");
System.out.print(df.format(d)); // returns "1"
double d = 1.23;
DecimalFormat df = new DecimalFormat("#.####");
System.out.print(df.format(d)); // returns "1.23"
double d = 1.2345678;
DecimalFormat df = new DecimalFormat("#.####");
System.out.print(df.format(d)); // returns "1.2346", rounding off: bad!
Run Code Online (Sandbox Code Playgroud)
现在我想要整数,例如1.0在"1"没有必要的情况下返回.0,#格式字符确实提供了该功能.但是我该如何确保数字永远不会变圆呢?是否有任何其他的方式比任意长的链其他#如"#.###########################################"?
或者我应该使用double到string的默认转换,并截断".0"它在结尾处是否出现:
String s = "" + d;
if(s.substring(s.length()-2).equals(".0")) {
s=s.substring(0, s.length()-2);
}
Run Code Online (Sandbox Code Playgroud)
这两种方式看起来都非常笨拙.
我只想删除包含.0的浮点数的小数部分.所有其他数字都可以接受..例如:
I/P: 1.0, 2.2, 88.0, 3.56666, 4.1, 45.00 , 99.560
O/P: 1 , 2.2, 88, 3.567, 4.1, 45 , 99.560
Run Code Online (Sandbox Code Playgroud)
有没有任何方法可以做到这一点,除了 " 比较数字与".0"并采取子串 "?
编辑:我不想要ACTING FLOAT NUMBERs(比如1.0,2.0只不过是1对吗?)
我觉得我的问题有点令人困惑......
这是我的澄清:我只想向用户显示一系列浮点数.如果数字的小数部分为零,则仅显示整数部分,否则按原样显示数字.我希望现在很清楚..
如果字符串在小数点后仅包含零,如何删除字符串值中的尾随零并删除小数点?我正在使用以下代码:
String string1 = Double.valueOf(a).toString()
Run Code Online (Sandbox Code Playgroud)
这将删除(10.10和10.2270)中的尾随零,但我没有获得第一和第二输入的预期结果.
输入
10.0
10.00
10.10
10.2270
Run Code Online (Sandbox Code Playgroud)
预期产出
10
10
10.1
10.227
Run Code Online (Sandbox Code Playgroud) 我想删除所有尾随零而不截断或舍入数字,如果它没有任何.例如,数字可能类似12.0,在这种情况下,应删除尾随零.但这个数字也可能是一种几乎不合理的东西,比如12.9845927346958762...继续走到屏幕的边缘.有没有办法设置DecimalFormat或其他类来剪切尾随零,同时保持非理性完整?
我正在尝试制作一个程序,它需要一些用户输入,运行一些计算并输出答案.我的问题是,这个答案有时会长很多小数位,导致一些美学和布局问题.我只需要显示4位小数的数据.无论如何,在输出时限制这些数字的精度?(数字存储在浮点数中,我正在为Android编程.)
我正在使用DecimalFormat将双精度格式化为String.然后将此String集成到我的表示层中.
格式: ### - >这将使用所有的数字之前小数点,但张学波数字后的小数点.
我可以使用#.#########作为大小数,但是如果小数更长的话怎么办?
我发现我的小测试程序很有用,并希望与您分享.
你能帮我显示所有小数吗?
package be.softwarelab.numbers;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
public class DecimalNumbersTest {
private static final double NUMBER = 123456789.123456789;
public static void main(String[] args) {
String format01 = "#.";
String format02 = "#.#";
String format03 = "#.##";
String format04 = "#.###";
String format05 = "#.####";
System.out.println("====== NUMBER ===== USA =====================================");
showResult(NUMBER, format01, Locale.US);
showResult(NUMBER, format02, …Run Code Online (Sandbox Code Playgroud)