
# Flink Decimal计算精度增强
#### 使用场景
在FlinkSQL的Decimal类型计算中，默认的计算精度可能无法满足业务需求，导致计算结果出现精度丢失或截断。可以通过开启Decimal计算精度增强特性，扩大Decimal计算结果的精度，使计算结果更加准确。
#### 约束与限制
使用该特性时需要在Flink进程中添加参数：**-Ddecimal.nonstandard=true**
本章节仅适用于MRS 3.6.0-LTS及之后版本。
#### 使用方法
配置Flink作业时，可通过在FlinkServer WebUI的Flink作业开发界面添加自定义参数"env.java.default-opts.all"为"-Ddecimal.nonstandard=true"开启，可参考[集群连接模式创建Flink SQL作业](https://support.huaweicloud.com/cmpntguide-lts-mrs/mrs_01_24024.html)。
作业示例：
```
public class DataStreamJob {
 public static void main(String[] args) throws Exception {
  // create environments of both APIs
  StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
  StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
  // create a DataStream
  DataStream<BigDecimal> dataStream = env.fromElements(new BigDecimal("1.1234"));
  // interpret the insert-only DataStream as a Table
  Table inputTable = tableEnv.fromDataStream(dataStream,Schema.newBuilder().column("f0", DataTypes.DECIMAL(18,10)).build());
  //Table inputTable = tableEnv.fromDataStream(dataStream);
  System.out.println(inputTable.getResolvedSchema());
  // register the Table object as a view and query it
  tableEnv.createTemporaryView("InputTable", inputTable);
  Table resultTable = tableEnv.sqlQuery("SELECT f0*f0 FROM InputTable");
  // interpret the insert-only Table as a DataStream again
  DataStream<Row> resultStream = tableEnv.toDataStream(resultTable);
  // add a printing sink and execute in DataStream API
  resultStream.print();
  env.execute();
 }
}
```
执行结果：
- 开启该特性的计算结果：
  ```
  1.2620275600000
  ```
  
- 不开启该特性的计算结果：
  ```
  1.262028
  ```
  
 
