休息Web服务精确返回双精度

时间:2014-09-08 13:12:57

标签: java rest precision double-precision

我有以下代码获得5位十进制但没有得到的双倍

@RequestMapping(value = "/double1/{double}", method = RequestMethod.GET)
    @ResponseBody
    public double getDouble1(@PathVariable("double")double dou){
        System.out.println(dou);
        return dou;
    }

以下是输入输出

http://localhost:8080/svc/double1/4569999999999991.922222222333 ==> 4569999999999991
http://localhost:8080/svc/double1/4569999999999991.1234567 ==> 4569999999999991 

1 个答案:

答案 0 :(得分:1)

Michael Laffargue的链接问题(Spring MVC @PathVariable getting truncated)有答案 - double中的'.'被自动解析为文件扩展名(然后由Spring MVC解释为Accept标头) 。您可以在XML Spring配置中禁用此后缀模式匹配:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="useDefaultSuffixPattern" value="false" />
</bean>

或在WebMvcConfigurerAdapter中使用JavaConfig:

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
    configurer.setUseSuffixPatternMatch(false);
}

我还建议使用BigDecimal代替double,如Jon Skeet和Michael建议的那样,由于精确度损失。