为什么在Galaxybase上用Java执行算法查询后,在解析和编写返回给客户端的结果时,属性值会出现在科学记数法中?

以下是我编写的代码:

public class Test {
    public static void main(String[] args) throws IOException {
        GalaxyBaseClient client = new GalaxyBaseClient("localhost", 8180);

        String query = "g.V().hasLabel('person').has('age', gt(20)).values('name', 'age')";
        GremlinResultSet result = client.submit(query);

        FileWriter fw = null;
        try {
            fw = new FileWriter("test.csv");

            String[] columnNames = {"name", "age"};
            for (int i = 0; i < columnNames.length; i++) {
                fw.write(columnNames[i]);
                if (i < columnNames.length - 1) {
                    fw.write(",");
                }
            }
            fw.write("\n");

            while (result.hasNext()) {
                Object[] values = result.next();
                for (int i = 0; i < values.length; i++) {
                    Object value = values[i];
                    fw.write(value.toString());
                    if (i < values.length - 1) {
                        fw.write(",");
                    }
                }
                fw.write("\n");
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fw != null) {
                fw.close();
            }
            result.close();
            client.close();
        }
    }
}

推荐答案

双精度类型的属性在解析后写入文件时,将成为科学记数法. 这种科学记数法的问题是,Java会将过大或过小的数据自动转换为科学记数法,这可以通过Java的BigDecimal类来解决.

String str=new BigDecimal(num+"").toString().

对于您的情况,可以按如下方式进行优化:

            while (result.hasNext()) {
                Object[] values = result.next();
                for (int i = 0; i < values.length; i++) {
                    Object value = values[i];
                    if (value instanceof Double) {
                        String str = new BigDecimal(Double.toString((Double)value)).toString();
                        fw.write(str);
                    } else {
                        fw.write(value.toString());
                    }
                    if (i < values.length - 1) {
                        fw.write(",");
                    }
                }
                fw.write("\n");
            }

Java相关问答推荐

无法从TemporalAccessor获取Instant:{},ISO解析为2024-04- 25 T14:32:42类型为java.time. form.Parsed

如何从片段请求数据到活动?在主要活动中单击按钮请求数据?

为什么Java中的两个日期有差异?

为什么一个java函数会返回一个作为参数传递给它的对象?

如何才能使我的程序不会要求两次输入?

如何在运行时动态创建表(使用Java、JPA、SprringBoot)

什么是Java原子属性的正确getter和setter

在Spring Boot中使用哪个Java类来存储创建时间戳?

基于接口的投影、原生查询和枚举

Java中将文本拆分为数字或十进制数字和字符串

GetChildren().emoveAll()不会删除 node

Java17支持哪个MapR版本?

为什么Collectors.toList()不能保证易变性

如何在盒子的顶部和底部创建两张不同图片(大小相同)的盒子?

将双倍转换为百分比

在一行中检索字符分隔字符串的第n个值

读取ConcurrentHashMap中的可变对象

javax.crypto-密码对象-提供者服务是如何工作的?

关于正则表达式的一个特定问题,该问题与固定宽度负向后看有关

为什么 log4j 过滤器在appender中不起作用