Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Corda-具有聚合和的Vault查询(MappedSchema中的双字段)_Corda - Fatal编程技术网

Corda-具有聚合和的Vault查询(MappedSchema中的双字段)

Corda-具有聚合和的Vault查询(MappedSchema中的双字段),corda,Corda,我需要总结一个州的专栏。我创建了一个mappedSchema,并将字段定义为Double。 如果我列出状态,则该字段的值是正确的。但是如果我使用builder::sum(),则返回的值会有舍入问题,小数位数会比应该的多 以下是代码的摘录: 状态 data class ConsumerMeteringState(val metering : ConsumerMetering, val meteringParticipants : List&

我需要总结一个州的专栏。我创建了一个mappedSchema,并将字段定义为Double。 如果我列出状态,则该字段的值是正确的。但是如果我使用builder::sum(),则返回的值会有舍入问题,小数位数会比应该的多

以下是代码的摘录:

状态

data class ConsumerMeteringState(val metering : ConsumerMetering,
                             val meteringParticipants : List<AbstractParty> = listOf(),
                             override val linearId: UniqueIdentifier = UniqueIdentifier()) :
    LinearState, QueryableState {
override val participants: List<AbstractParty> = meteringParticipants

override fun generateMappedObject(schema: MappedSchema): PersistentState {
    return when (schema) {
        is ConsumerMeteringSchemaV1 -> ConsumerMeteringSchemaV1.PersistentConsumerMetering(
                this.metering.dateTimeIni,
                this.metering.dateTimeEnd,
                this.metering.quantityKwh,
                this.linearId.id
        )
        else -> throw IllegalArgumentException("Unrecognised schema $schema")
    }
}

override fun supportedSchemas(): Iterable<MappedSchema> = listOf(ConsumerMeteringSchemaV1)
}

Vault查询条件

object ConsumerMeteringSchemaV1 : MappedSchema(
    schemaFamily = ConsumerMeteringSchema.javaClass,
    version = 1,
    mappedTypes = listOf(PersistentConsumerMetering::class.java)) {
@Entity
@Table(name = "consumer_metering_states")
class PersistentConsumerMetering(
        @Column(name = "date_time_ini")
        var dateTimeIni: Instant,

        @Column(name = "date_time_end")
        var dateTimeEnd: Instant,

        @Column(name = "quantity_kwh")
        var quantityKwh: Double,

        @Column(name = "linear_id")
        var linearId: UUID
) : PersistentState() {
    // Default constructor required by hibernate.
    constructor(): this(Instant.now(), Instant.now(), 0.0, UUID.randomUUID())
}
val criteriaAccount = QueryCriteria.VaultQueryCriteria(externalIds = listOf(accountId))
val sumQuantityKwh = builder { ConsumerMeteringSchemaV1
            .PersistentConsumerMetering::quantityKwh.sum() }
val sumQuantityKwhCriteria = QueryCriteria.VaultCustomQueryCriteria(sumQuantityKwh)
serviceHub.vaultService.queryBy(contractStateType = ConsumerMeteringState::class.java,
    criteria = criteriaAccount.and(sumQuantityKwhCriteria)).otherResults.singleOrNull()
仅状态(值正常):

[消费者测量状态(计量=消费者测量)(dateTimeIni=2020-06-03T09:46:00Z,dateTimeEnd=2020-06-03T09:59:00Z,quantityKwh=10.55),计量参与者=[匿名(DL624I3IETTLKpuvugzn5JEG3MD2Cvant6SznjixWY),O=分销商,L=Curitiba,C=BR],linearId=2e5009ad-56c3-4fed-ba36-0D48E668C),消费者状态(计量=消费者计量(dateTimeIni=2020-06-03T09:46:00Z,dateTimeEnd=2020-06-03T09:59:00Z,数量kWh=50.18),计量参与者=[匿名(DLBEP6KDDUAMKVRSZQWA7N8I6YNNJLTA4WXSP4QMZIEJC),O=分销商,L=Curitiba,C=BR],linearId=3b012984-676d-4e62-9b9f-1bb8158aaf4b)]

与生成器总和:

我得到的值是60.730000000000004


为什么sum不返回60.73?

它通过将列类型从Double更改为BigDecimal来工作。这似乎是Double类型的精度问题。 我做了一个测试,只需检索状态并对quantityKwh(Double)字段进行简单求和,精度已经很奇怪了。 我不明白这种行为的原因,但使用BigDecimal时,效果很好