我想将一个double序列保存到一个.txt文件中,并稍后在C中阅读它们。如何在不损失精度的情况下实现这一点?我不知道要保存多少位数?我怀疑如果没有保存足够的数字,我可能无法获得我保存的确切倍数。
下面是我尝试过的
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
public class Solution {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
while(true){
System.out.println("start!!");
int input = Integer.parseInt(br.readLine());
if(input == 0){
break;
}
int ddable = 2*input;
int answer = 0;
ArrayList<Integer> base = new ArrayList<>();
if(input == 1){
answer = 1;
}else {
System.out.println("It is not 1");
for(int i = 2 ; i <= ddable ; i++ ){
base.add(i);
}
for ( int i = 2 ; i <= ddable ; i++ ){
for ( int j = 2 ; i*j <=ddable ; j++){
if(base.contains(new Integer(i*j))){
base.remove(new Integer(i*j));
System.out.println(i*j+"removed");
}
}
}
int count = 0;
for ( int i = input ; i <= ddable ; i++){
if(base.contains(new Integer(i))){
count++;
}
}
answer = count;
}
System.out.println("syso: "+answer);
bw.write("bw: "+answer);
}
bw.flush();
br.close();
bw.close();
}
}
我(我想)对数据的两个不精确表示doubles=[3.14159, 3.14159265358]
filename="tmp.txt"
with open(filename,'w') as f:
for x in doubles:
f.write("%.16f\n" %x)
。
3.1415899999999999
3.1415926535800001
这是不可取的。我希望数据按原样存储,以便另一个程序可以准确地检索它们。有想法吗?
答案 0 :(得分:2)
在C11中,将DBL_DECIMAL_DIG
定义为精确地用于此用途:请参见https://en.cppreference.com/w/c/types/limits。它告诉您所需精度的小数位数,以便先加载已保存的double
,然后先进行保存然后重新加载,这意味着两个加载步骤将始终返回相同的 double
。
DBL_DECIMAL_DIG
通常为17。