Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >XSLT舍入问题

XSLT舍入问题
EN

Stack Overflow用户
提问于 2015-10-23 04:57:20
回答 2查看 2.2K关注 0票数 0

我们在使用XSLT舍入和格式化数字函数时遇到了一个非常奇怪的问题。假设我有一个像131.855这样的数字,我想把它四舍五入到小数点后两位。我期望131.86作为答案,但是XSLT round()函数将其舍入为131.85。我尝试使用“round(131.855*100)div100”,但它不起作用。然而,如果我必须舍入一个像127.855这样的数字,它确实会使用相同的代码正确地舍入为127.86,即" round (127.855 *100)div100“。此外,奇怪的是,如果我尝试四舍五入131.755,它确实四舍五入为131.76!非常奇怪。我们也尝试使用format-number()函数,但这也会产生奇怪的结果。例如,如果我取数字349615.225,并对其使用format-number (即format- number (349615.225,'#.##') ),它会给出349615.22,而我希望小数是.23。但如果我在131.855上使用format-number,它确实会转换为131.86...

我也尝试过在format-number()中使用round()函数,但它也给出了类似的结果。

我们使用的是XSLT 1.0。转换到XSLT 2.0似乎是一项艰巨的任务。我看到的唯一解决办法是使用一些java函数,并从XSL中调用它来进行舍入。

任何想法都将受到高度赞赏。

编辑:

奇怪的是,同样的问题也发生在Java的Math.round函数上。

EN

回答 2

Stack Overflow用户

发布于 2015-10-23 05:40:40

您可以使用以下内容:

format-number(round(100 * $number) div 100, '#.00')

round()函数将数字舍入为最接近的整数,仅使用round()可能无法正确地对数字进行舍入。

format-number()通过修剪数据来格式化数字(我猜),这可能会导致价值损失。

同时使用round()format-number()将有效地工作。

下面的例子描述了不同的行为。

输入:

代码语言:javascript
代码运行次数:0
复制
<root>5.225</root>

XSLT:

代码语言:javascript
代码运行次数:0
复制
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:output method="text" />
    <xsl:template match="/">
        <xsl:value-of select="round(*)"/>
        <xsl:text>&#xa;</xsl:text>
        <xsl:value-of select="round(100 * *)"/>
        <xsl:text>&#xa;</xsl:text>
        <xsl:value-of select="format-number(*, '#.00')"/>
        <xsl:text>&#xa;</xsl:text>
        <xsl:value-of select="format-number(round(100 * *) div 100, '#.00')"/>
    </xsl:template>
</xsl:transform>

输出:

5

523

5.22

5.23

票数 1
EN

Stack Overflow用户

发布于 2015-10-23 08:23:08

首先要理解的是,当你写一个像131.855这样的数字时,它表示的实际值并不完全是131.85和131.86之间的一半。不存在数值上完全等于131.855的双精度浮点数,因此您正在操作的实际值略低于或略高于该值。当你写下数字的时候,这种不精确就会出现,它不仅仅是当你在上面做算术的时候出现的。当你将它乘以100时,这个差值会被放大,当你使用round()时,它会得到最近的整数,这将取决于最初的近似值是向上还是向下。因此,由于XSLT 1.0只提供浮点数,因此没有办法避免这种问题。

在XSLT 2.0中,您可以使用十进制数字,它的行为更符合人类的期望。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33295141

复制
相关文章
数据结构和算法——插入排序
插入排序的工作方式是:维护已排序的子列表,一一提取主列表中的项目,然后将其插入子列表中,直到所有项目都从主列表移到子列表中为止。
Lemon黄
2019/11/24
4180
数据结构003:有效的数独
根据题目的规则,数独需要满足三个规则,针对规则一和二可知,我们在遍历每个元素的时候,需要判断该元素所在行和列中是否出现过,即可判断该元素是否满足规则一和二,因此我们可以针对每一行、每一列出现元素的次数作为校验标准,例如声明两个二维数组row[9][9] 和col[9][9] 分别代表行和列上面0-9 出现的次数。例如row[1][2] 表示第1行中,出现2的次数,col[4][3] 表示第4列出现3的次数(都是从第0行/列开始算的)。对于数独数组第i 行j 列上的数值n=board[i][j] ,首先将row[i][n] 上对应的值加一,再将col[j][n] 也加一,然后判断row[i][n] 和row[i][n] 的值是否大于1,大于1则表明i 行或者j 列数字n 出现的次数大于1,即不唯一。不满足规则一或者二。
艰默
2022/12/11
7770
数据结构003:有效的数独
数据结构003:有效的数独
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
艰默
2022/12/12
4200
数据结构003:有效的数独
插入和删除时的有效平均案例群体恢复
作者:Frank Ban,Xi Chen,Rocco A. Servedio,Sandip Sinha
罗大琦
2019/07/18
6560
插入和删除时的有效平均案例群体恢复
Go 数据结构和算法篇(五):插入排序
插入排序的原理是:我们将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。
学院君
2023/03/03
2470
Go 数据结构和算法篇(五):插入排序
数据结构 插入排序算法
插入排序算法是所有排序方法中最简单的一种算法,其主要的实现思想是将数据按照一定的顺序一个一个的插入到有序的表中,最终得到的序列就是已经排序好的数据。
Meng小羽
2019/12/22
4620
数据结构:插入类型排序的总结(考研)
插入类排序包括直接插入排序,折半插入排序以及希尔排序。 插入排序默认第一个位置(下标为0)的元素是有序的,需要将在[2…n-1]这个区间中剩下的n-1个元素在有序的位置区间寻找一个合适的位置进行插入。
lexingsen
2022/02/24
1850
C++ 数据结构和算法入门笔记
世界上的所有事物都可以看做是对象,二对于每个对象,抽想起来均可以分为两个要素,属性和行为。
独元殇
2023/03/14
1.6K0
PHP数据结构-插入类排序:简单插入、希尔排序
总算进入我们的排序相关算法的学习了。相信不管是系统学习过的还是没有系统学习过算法的朋友都会听说过许多非常出名的排序算法,当然,我们今天入门的内容并不是直接先从最常见的那个算法说起,而是按照一定的规则一个一个的介绍。
硬核项目经理
2021/06/10
9170
PHP数据结构-插入类排序:简单插入、希尔排序
MySQL 插入、更新、删除、简单检索
插入的时候 后面括号的数据和前面要插入的字段数量和类型必须是一致的。 如果是字符型 得用 '' 或者""引起来。
宁在春
2022/10/31
9250
MySQL 插入、更新、删除、简单检索
数据结构005:有效的字母异位词
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
艰默
2023/02/26
2900
数据结构005:有效的字母异位词
数据结构散列线性开型寻址(C++实现)插入,删除,查找
插入x,若散列表已存在x,输出“Existed”,否则插入x到散列表中,输出所在的下标。 查询x,若散列表不含有x,输出“-1”,否则输出x对应下标。 删除x,若散列表不含有x,输出“Not Found”,否则输出删除x过程中移动元素的个数。 输入格式 第一行两个整数D(1≤\leq≤ D ≤\leq≤ 3000)和m(1≤\leq≤ m ≤\leq≤ 3000),其中D为散列函数的除数,m为操作数。 接下来的m行,每行两个整数opt和x,分别代表操作类型和操作数。 若opt为0,则代表向散列表中插入x; 若opt为1,代表查询散列表中x是否存在; 若opt为2,(如果散列表中含有x),删除x。 数据保证散列表不会溢出。 输出格式
种花家的奋斗兔
2020/11/13
9520
数据结构:程序加图示分析单链表的插入和删除操作
下图展示了单链表的基本结构: head指针是链表的头指针,指向第一个节点,每个节点的next指针域指向下一个节点,最后一个节点的next指针域为NULL,在图中用0表示。 下面先来看程序(栈的链式存储
s1mba
2018/01/03
1.3K0
数据结构:程序加图示分析单链表的插入和删除操作
golang数据结构之插入排序
//InsertSort 插入排序 func InsertSort(arr *[7]int) { for i := 1; i < len(arr); i++ { insertVal := (*arr)[i] inserIndex := i - 1 for inserIndex >= 0 && (*arr)[inserIndex] > insertVal { (*arr)[inserIndex+1] = (*arr)[inserI
西西嘛呦
2020/08/26
2510
《数据结构与算法_插入排序》
代码实现: package com.datastruct.sort; import java.util.Arrays; /** * 插入排序Java实现 * @author Administrator * */ public class InsertSort { public static void insertSort(int [] array) { for(int i = 1;i<array.length;i++) {
梅花
2020/09/28
2190
数据结构——优先队列(C++和Java实现)
十几天没有更新自己的博客了,因为目前在算法和数据结构的学习中,碰到了一些问题,例如之前就在优先队列,堆这个数据结构面前,感觉到有点吃不透概念,而使用的那本书上写的实在太抽象了,所以又查找了很多资料,最终对优先队列这个数据结构有了一定的了解。花了点时间才啃下来的知识,当然要把它记录下来了,所以今天就来回顾一下优先队列。
Originalee
2018/08/30
5680
MySQL(二)数据的检索和过滤
使用频率最高的SQL语句应该就是select语句了,它的用途就是从一个或多个表中检索信息,使用select检索表数据必须给出至少两条信息:想选择什么,以及从什么地方选择
allsmallpig
2021/02/25
4.1K0
数据结构-单链表的读取,插入与删除
链表定义: struct ListNode { int value; ListNode *next; }; 单链表读取 在顺序存储结构中,比如数组中,想要获取某一个位置的数据是非常容易的一件事
chaibubble
2018/01/02
1.1K0
数据结构-单链表的读取,插入与删除
【数据结构】队列(C++)
设立一个队头指针front,一个队尾指针rear,分别指向队头元素和队尾元素,rear-front为元素个数。
半生瓜的blog
2023/05/13
5370
【数据结构】队列(C++)
浅谈C++ 数据结构
C/C++ 数组允许定义可存储相同类型数据项的变量,但是结构是 C++ 中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。
C语言与CPP编程
2020/12/02
7780

相似问题

Windows内核内存保护

22

Windows、Emacs、Git Bash和shell命令

34

Windows 7上的Emacs构建过程

10

OSX/Bash -检测构建失败

30

如何在Windows 10 Bash上使用X Windows和Emacs?

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文